挑战
企业客户拒绝在缺乏身份联邦和自动化生命周期管理的情况下采用该平台:
- SSO 要求 — IT 部门强制要求员工通过其公司身份提供商登录,而不是使用单独的凭据
- 手动入职开销 — 当新组织注册时手动添加数百名员工需要数天的管理工作
- 离职风险 — 当员工离开组织时,其平台帐户会保持活动状态数周,从而引发合规性和数据访问担忧
- 基于组的访问 — 不同的员工组需要不同的功能层级和项目访问权限
- 多租户复杂性 — 每个企业客户都有自己的身份提供商租户,具有不同的配置、属性映射和组结构
- 现有认证共存 — 平台已有电子邮件/密码和基于 OAuth 的身份验证;SSO 需要在不破坏现有流程的情况下共存
我们的解决方案
我们实施了通过 SAML 2.0/OIDC 的 Okta SSO 进行身份验证,以及 SCIM 2.0 进行自动化用户配置、取消配置和组同步——并将其集成到现有的多租户后端中。
架构
- 身份提供商 (IdP): Okta (客户管理的租户)
- SSO 协议: SAML 2.0 (主要) + OIDC (替代)
- 配置: SCIM 2.0 服务器内置于平台后端
- 后端: NestJS 与 PostgreSQL 和 Redis
- 认证层: 基于 JWT 的会话,具有 SSO 感知令牌签发功能
- 管理员仪表盘: 基于 React 的租户配置用于 SSO 设置
- 现有认证: 电子邮件/密码 + Google OAuth 与 SSO 并存
---
SSO 实施 (SAML 2.0 / OIDC)
SAML 2.0 流程
服务提供商 (SP) 发起的 SAML 流程如下:用户访问登录页面并选择 SSO,输入其公司电子邮件域,平台根据该域识别租户的 Okta 配置,向 Okta 发送 AuthnRequest,用户进行身份验证,Okta 返回一个签名 SAML assertion,平台验证该 assertion 并使用 JWT 令牌创建会话。
各租户配置
每个租户的 SSO 配置包括其身份提供商的 SSO URL、entity ID、用于签名验证的 X.509 证书,以及平台的 SP entity ID、assertion consumer service URL,以及从身份提供商配置文件字段到平台用户字段的属性映射。
OIDC 替代方案
对于偏好 OIDC 而非 SAML 的客户,平台支持带有 PKCE 的 Authorization Code 流程,通过 OIDC claims 和使用 JWKS 进行 ID token 验证来使用相同的属性映射。
多租户 SSO 路由
平台根据用户的电子邮件域将用户路由到正确的身份提供商。当用户输入其电子邮件时,平台会将该域与租户 SSO 配置进行比对。如果配置了 SSO,用户将被重定向到其组织的 Okta 租户。如果未配置,他们将回退到电子邮件/密码或 Google OAuth。平台也支持自定义 URL 以实现直接 SSO 访问。 ---
SCIM 2.0 实施
SCIM 服务器
平台公开了一个符合 SCIM 2.0 标准的 API,Okta 调用该 API 来管理用户和组。该 API 支持完整的用户生命周期操作(创建、读取、更新、停用、删除)、带成员管理的组 CRUD 操作,以及用于功能、模式和资源类型的标准 SCIM 发现端点。
通过 SCIM 进行用户生命周期管理
配置:当管理员在 Okta 中将用户分配给平台应用程序时,Okta 会向 SCIM API 发送创建请求。平台创建具有租户关联的用户帐户,将其标记为活动状态并已通过 SSO 配置,用户可以立即通过 SSO 登录。
个人资料更新:当管理员在 Okta 中更新用户个人资料时,更改会通过 SCIM 推送到平台。如果部门发生变化,组籍将自动重新评估。
取消配置:当用户从 Okta 中的应用程序中移除时,平台会停用该帐户——立即撤销所有活动会话,阻止进一步登录,根据保留策略保留数据,并释放许可席位。
重新激活:在 Okta 中重新分配用户会重新激活其帐户,所有历史数据保持不变。
组同步
Okta 组映射到平台角色和项目层级——控制对不同功能级别、管理员功能、专用仪表盘和专属项目注册的访问。Okta 中的组籍更改通过 SCIM 推送,并实时反映,无需重新登录。 ---
安全与认证
SSO 后的令牌签发
在 SAML assertion 验证后,平台会签发包含用户身份、组织、角色(源自 SCIM 组籍)、认证方法和身份提供商声明的租户范围 JWT——从而实现 SSO 与其他认证方法之间的审计区分。
会话管理
- SSO 会话遵循 Okta 的会话生命周期
- 支持单点注销 (SLO),当用户从 Okta 注销时终止会话
- 后端注销 webhook 用于立即撤销会话
- SCIM 停用可在 60 秒内撤销所有活动会话
安全控制
- 针对租户的 X.509 证书进行 SAML 响应签名验证
- 通过一次性使用跟踪防止断言重放
- 断言时间戳验证的时钟偏移容忍
- 受众限制验证
- 支持加密断言以用于敏感部署
- 通过各租户 Bearer tokens 进行 SCIM 端点认证
- SCIM 端点上的速率限制
---
管理员配置仪表盘
租户 SSO 设置
管理员仪表盘提供了一个自助设置流程:
- 协议选择 — 选择 SAML 2.0 或 OIDC
- 元数据上传 — 上传 IdP 元数据 XML(自动填充配置)
- 属性映射 — 将身份提供商配置文件字段映射到平台用户字段
- 域验证 — 验证电子邮件域的所有权以进行 SSO 路由
- 测试连接 — 在为所有用户启用之前启动测试 SSO 登录
- SCIM 设置 — 为 SCIM 配置生成 Bearer token
- 组映射 — 将身份提供商组映射到平台角色和层级
仪表盘还提供可下载的 SP 元数据,以便于身份提供商应用程序配置。 ---
主要特点
- SAML 2.0 + OIDC 支持 — 各租户可灵活选择协议
- SCIM 2.0 配置 — 自动化用户创建、更新和停用
- 组到角色映射 — 身份提供商组控制平台访问层级和项目
- 即时取消配置 — SCIM 停用可在 60 秒内撤销访问权限
- 多租户 SSO 路由 — 基于电子邮件域的跨租户 IdP 发现
- 认证方法共存 — SSO 与电子邮件/密码和 Google OAuth 并存
- 自助设置 — 无需工程支持的 SSO 配置管理员仪表盘
- 单点注销 — 用户从身份提供商注销时,平台会话终止
- 审计跟踪 — 每个 SCIM 操作和 SSO 事件均记录用于合规性
- SCIM 组同步 — 身份提供商组籍带来的实时角色和项目变更
成果
技术栈
常见问题
MicrocosmWorks 实施了 SCIM 2.0 协议,以实现在 Okta 与健康保健平台之间的自动用户配置和解除配置。因此,当 IT 管理员在 Okta 目录中添加、修改或删除用户时,这些更改会在几秒钟内传播到应用程序。这消除了 IT 团队之前通过支持工单处理的手动账户创建、权限更新和离职任务,将访问管理开销减少了约 90%。
MicrocosmWorks 构建了一个可配置的角色映射层,将 Okta 群组成员资格转换为应用程序级别的角色和权限,支持直接的群组到角色的映射以及结合多个群组成员资格的复杂规则。当用户的群组成员资格在 Okta 中发生变化时,SCIM 集成会实时更新他们的应用程序权限,并且系统会记录每次权限更改以实现审计合规性。
MicrocosmWorks 实施了实时会话撤销功能,该功能监控 SCIM 停用事件,并立即使被停用用户在所有设备和浏览器上的所有活跃会话失效。系统不会等待令牌过期;它会在 Okta 事件发生后的几秒钟内,主动将会话撤销信息推送到会话存储中,这对于员工被解雇时需要立即移除访问权限的安全合规性至关重要。
是的,MicrocosmWorks 设计的身份验证层通过 Okta 的路由规则支持多个并发的身份提供商,允许来自不同企业目录的用户通过各自的 IdP 进行身份验证,同时访问同一个应用程序实例。这在 M&A 过渡期间至关重要,在此期间,合并后的组织会维护独立的 Active Directory 域,并且系统会透明地处理 IdP 之间属性映射的差异。
MicrocosmWorks 以 $25-$45/小时的费率实现 Okta SSO 和 SCIM 集成,一个典型的集成项目通常需要 3-6 周,具体取决于角色映射的复杂性以及需要同步的现有用户属性的数量。这项投资远低于手动用户管理的持续成本以及延迟访问撤销带来的安全风险,并且它通常是签订企业销售合同的要求之一。
