单点登录与企业身份接入
单点登录(SSO)让多个应用依赖同一个身份提供方完成认证。用户少输入一次密码,只是可见效果;真正需要管理的是中心登录态、各应用本地会话,以及身份与组织成员关系之间的映射。
中心会话与应用会话
假设应用 A、B 都通过 OIDC 接入身份提供方。图中省略授权码与令牌的详细校验,完整交换见 OIDC 授权码流程;应用 B 的免重复输入,来自中心会话仍有效且认证策略允许。
两次回调分别关联各自发起的登录事务。身份系统的 Cookie 只在访问其域名时发送,不交给 A 或 B;两个应用也不会互相收到对方的本地会话 Cookie。
A、B 可以位于不同域名,不必共享 Cookie。每个应用仍有独立 client_id、回调、受众与权限边界;SSO 不是把 A 的会话字符串直接复制给 B。
共享父域 Cookie 虽然容易起步,却会扩大子域被攻破后的影响,也无法自然支持不同主域。若选择这种架构,应把所有可接触 Cookie 的应用都视作同一信任边界,而不是声称各子应用完全隔离。
三种退出语义
| 操作 | 涉及状态 | 用户可能观察到的结果 |
|---|---|---|
| 应用本地退出 | A 的本地 Session | B 仍在线;再次进入 A 可能通过中心会话自动登录 |
| 中心退出 | 身份提供方会话 | 不一定已经清除 A、B 本地 Session |
| 联动退出 | 中心与相关应用会话 | 受协议支持、投递成功和本地处理影响 |
产品文案要对应实际语义。“退出此应用”和“退出所有应用”不能共用一个只删除本地 Cookie 的实现。
OIDC RP-Initiated Logout定义应用请求身份提供方退出的机制。应用仍需清理自己的会话,退出后的跳转地址也需要按提供方注册与校验规则处理,不能任意接受外部 URL。
联动退出与投递失败
OIDC Back-Channel Logout通过服务端直接投递 Logout Token,减少对浏览器页面与第三方 Cookie 的依赖。RP 验证签名、issuer、audience、时间、事件类型及主体或会话标识,再撤销对应本地会话。
实现还要保留 (issuer, sid) 或适当的主体到本地会话映射,不能把 Logout Token 当作普通登录令牌接受。重复通知按幂等方式成功处理;已退出的目标会话无需再次报错。
服务端通知仍可能超时。设计需要明确:
- 投递失败是否重试,积压是否告警。
- 多实例的会话缓存如何失效。
- 未接入退出协议的应用,最晚何时重新检查中心或本地账号状态。
- 退出后已经签发的 Access Token 如何处理。
“支持统一退出”不代表零延迟撤销。应给出经过验证的最坏生效时间,并区分中心会话、本地会话和 API 令牌。
企业身份与本地账号
同一员工可能在不同企业拥有不同身份。企业接入需要把连接配置与租户绑定,明确允许哪些 issuer、客户端、域名与成员来源。
仅看到邮箱后缀是 company.example,不足以认定其拥有企业管理员权限。企业连接开通应由有权管理员完成验证,成员登录后还要核对该连接对应的租户与成员状态。
外部组到本地角色的映射使用允许列表,并区分租户角色与平台管理员。未知组、缺失字段、超长组列表或大小写差异都不能默认提升权限。组或角色变更还需要定义已签发令牌的滞后窗口。
首次登录开通与目录同步
| 方式 | 开通时机 | 适用约束 |
|---|---|---|
| 管理员邀请 | 登录之前 | 审批明确,维护成本较高 |
| JIT 开通 | 首次成功登录时 | 依赖企业连接和映射策略,需处理并发与席位限制 |
| 目录同步 | 外部目录推送或同步时 | 可提前开通、禁用和调整组关系 |
JIT(Just-in-Time)只在用户登录时发生,无法单独保证离职员工及时停权。SCIM 提供跨域身份管理协议,见 RFC 7644;它承担账号或组的管理,与 OIDC 登录互补,不能互相替代。
目录同步事件要校验来源、租户和外部对象 ID,并处理幂等、乱序与部分失败。旧的“激活用户”事件晚于禁用事件到达时,不应自动恢复访问。可以维护来源版本、更新时间约束和定期对账。
离职停权
一次完整的停权至少要核查以下对象:
- 租户成员状态与角色。
- 当前应用会话及关联刷新族。
- 个人 Access Token、API Key 和代表用户运行的集成。
- 后台任务、导出、共享链接与资源所有权。
- 上游目录与本地状态之间的同步积压。
禁用租户成员不必注销个人账号,但与该企业相关的调用必须停止。离职人员创建的业务数据通常需要移交;具体归属与保留规则属于业务决策。
身份提供方不可用
中心不可用时,新登录和需要重新认证的操作通常失败;已建立本地 Session 是否继续有效,取决于本地期限与风险策略。应避免把每个低风险请求都变成对身份提供方的同步依赖,同时也不能无期限接受旧成员状态。
紧急管理员账号需要独立流程:限制使用范围、强认证、必要告警与事后复核。它是经过治理的恢复入口,不应成为所有员工都可使用的密码登录后门。
企业已有 SAML 时,应使用成熟实现核对元数据、签名、受众、时间与请求关联;不要为了统一技术栈自行解析和验证 XML 签名。本专题的流程示例以 OIDC 为主。
参考资料
- OpenID Foundation:RP-Initiated Logout 1.0
- OpenID Foundation:Back-Channel Logout 1.0
- IETF:RFC 7644 — SCIM Protocol
工程实践与社区文章
- 程晓飞(火山引擎开发者社区转载):用Python建设企业认证和权限控制平台——Django、LDAP、CAS 与企业统一用户平台的建设案例。