1. 什么是单点登录
单点登录(SSO,Single Sign-On):用户在多个相互信任的应用系统中,只需登录一次,即可访问所有已授权的系统。
其本质是架构层面的一次职责剥离:
- 改造前:每个应用各自管理登录页、密码存储、会话——账号分散、密码多处落库、安全策略不统一;
- 改造后:把“认证”从各应用中抽出来,集中到一个统一认证中心(IdP);应用只负责“拿着凭证去验证身份”,不再接触密码。
SSO 解决的四类问题:
- 多系统重复登录的体验问题;
- 密码多处存储带来的安全风险面扩大;
- 账号分散管理(入离职需到 N 个系统开关账号);
- 登录行为审计割裂,无法回答“谁在什么时候访问了什么”。
概念区分:认证(AuthN,回答“你是谁”)与授权(AuthZ,回答“你能干什么”)是两件事。SSO 只集中解决认证;各应用内部的权限控制仍由应用自己完成。
2. 运行原理:一次 SSO 登录发生了什么
sequenceDiagram
participant U as 用户浏览器
participant A as 应用A(未登录)
participant I as 统一认证中心(IdP)
U->>A: 访问受保护资源
A-->>U: 无局部会话,重定向到认证中心
U->>I: 跳转认证中心(携带回调地址)
I->>I: 校验账号凭证<br/>(已有全局会话则直接跳过)
I-->>U: 签发一次性票据,重定向回应用A
U->>A: 携带票据回到应用A
A->>I: 后台校验票据
I-->>A: 返回用户身份
A-->>U: 建立应用A局部会话,访问放行
流程可归纳为四步:
- 发现未登录:应用检查本地会话,不通过则重定向到认证中心;
- 集中认证:认证中心完成凭证校验(或复用已有全局会话),签发一次性票据;
- 票据换身份:应用在后台用票据向认证中心换取用户身份信息;
- 建立局部会话:应用创建自己的会话,后续请求直接放行,不再打扰认证中心。
2.1 核心机制:全局会话与局部会话
SSO“一次登录、处处访问”的关键,在于两层会话的分工:
flowchart TB
subgraph IDP["统一认证中心"]
GS["全局会话<br/>(用户 ↔ 认证中心之间)<br/>决定是否还需要输密码"]
end
GS --- A1["应用A 局部会话<br/>决定应用A是否放行"]
GS --- A2["应用B 局部会话<br/>决定应用B是否放行"]
GS --- A3["应用C(尚未访问)<br/>无局部会话"]
- 全局会话:用户与认证中心之间的登录状态。它存在时,用户再访问任何接入应用都无需再输密码——认证中心直接签发票据放行;
- 局部会话:用户与各应用之间的登录状态。各应用独立建立、独立失效,互不感知。
用户首次访问应用 B 时虽然没有 B 的局部会话,但全局会话仍在,于是“跳转一下就回来了”,全程无感——这就是 SSO 的体感来源。
3. 常见协议与实现方式
| 协议 | 定位 | 凭据形式 | 优势 | 局限 | 典型场景 |
|---|---|---|---|---|---|
| CAS | 企业内 SSO 专用协议 | 一次性票据(Ticket) | 流程简单、成熟稳定、内网友好 | 生态偏企业内部 | 高校、政企内网应用群 |
| OAuth 2.0 | 授权框架(本身不是认证协议) | 授权码 / Access Token | 生态最广、移动端与开放接口友好 | 只解决授权,不定义身份如何表达 | 开放平台、第三方登录 |
| OIDC | OAuth 2.0 之上的身份认证层 | ID Token(JWT 形态) | 标准化身份表达、现代协议栈、移动端友好 | 需要 OAuth 2.0 基础 | SaaS、移动端、微服务架构 |
| SAML 2.0 | 跨域联邦认证标准 | XML 签名断言 | 企业联邦事实标准、成熟 | 报文重、配置复杂、浏览器为主 | 大企业间联邦、政企对接 |
| LDAP / AD | 目录服务认证 | 账号密码绑定校验 | 直接复用企业已有账号源 | 不是 Web SSO 协议,通常作为身份源 | 企业内网账号底座 |
3.1 各协议原理速览
- CAS:即第 2 章流程的原型——“重定向 + 一次性票据 + 后台校验”,是理解所有 SSO 协议的最小模型;
- OAuth 2.0:核心是“用户不把密码交给第三方,而是通过授权码换取受限访问令牌”。它解决的是授权委托,身份表达需要在其上叠加 OIDC;
- OIDC:在 OAuth 2.0 流程中额外签发 ID Token(JWT 形态)。JWT 的原理是“令牌自带签名”——应用本地验签即可确认身份,无需每次回查认证中心(无状态);代价是令牌签发后难以主动作废,需配合短有效期 + 刷新机制 + 黑名单;
- SAML 2.0:与 CAS 思路同源,只是凭据换成带数字签名的 XML 断言,主打组织之间的跨域联邦信任;
- LDAP / AD:不是 Web SSO 协议,而是账号的存放与校验底座。常见做法是认证中心对接 AD/LDAP 做凭证校验,应用侧再走 CAS/OIDC——LDAP 管“账号在哪、密码对不对”,SSO 协议管“登录态怎么传”。
4. 统一身份体系架构
完整的 SSO 不是一个协议,而是一套统一身份体系:
flowchart LR
subgraph SRC["身份源"]
AD["AD / LDAP"]
LOC["本地账号库"]
EXT["第三方身份源"]
end
IDP["统一认证中心(IdP)<br/>认证 · 多因素认证(MFA)<br/>会话管理 · 安全审计"]
SRC --> IDP
IDP --> APP1["应用A(OIDC 接入)"]
IDP --> APP2["应用B(CAS 接入)"]
IDP --> GW["接入网关(老应用代接入)"]
IDP --> PT["统一门户 / 多租户入口"]
四个组成部分:
- 身份源:账号的权威来源(AD/LDAP、本地账号库、第三方),原则是“一处管理、处处同步”;
- 认证中心(IdP):承担凭证校验、多因素认证(MFA)、全局会话管理、票据/令牌签发与安全审计;
- 应用接入:新应用走标准协议接入;老系统无法改造的,用接入网关统一拦截认证,应用零改造纳入 SSO 管控;
- 统一门户:用户的应用入口与工作台,也是多租户场景下“一套系统”体感的载体。
与多租户的关系:实例级多租户方案(统一门户 + 租户独立部署)之所以能让用户感觉“是一套系统”,依赖的正是本篇的统一认证层——SSO 管身份的统一,多租户管数据的隔离,两者叠加才构成完整体验。
5. 单点登出与安全考量
5.1 单点登出(SLO)
单点登出是 SSO 落地最难的一环:登出本质是“销毁所有相关会话”,但各应用的局部会话彼此独立,认证中心无法替应用销毁它们。常见两种机制:
- 后端通知:认证中心向各已登录应用回调登出通知,各应用销毁自身局部会话;
- 前端广播:认证中心登出页通过浏览器向各应用的登出入口发起请求,清理前端会话态。
实践中通常两条腿走路,并在方案中明确:“认证中心登出”与“各应用局部会话失效”的最终一致时延。
5.2 安全要点
| 要点 | 原理 | 常见做法 |
|---|---|---|
| 票据一次性 | 票据被使用一次即作废,防重放 | 短有效期(秒级)+ 单次消费 |
| 回调地址白名单 | 防止票据被带向恶意地址 | 认证中心登记应用合法回调域 |
| 令牌防泄露 | JWT 类令牌无状态、难作废 | 短有效期 + Refresh Token 轮换 + 黑名单兜底 |
| 传输安全 | 凭据全程流转 | 全链路 HTTPS |
| 多因素认证(MFA) | 密码之外叠加第二因子 | 短信 / OTP / 扫码,敏感应用强制开启 |
| 会话策略 | 平衡“少登录”与“快失效” | 全局会话短、局部会话适中;敏感操作二次认证 |
6. 技术选型决策
flowchart TD
S["SSO 协议选型"] --> Q1{"应用与用户形态?"}
Q1 -- "对外 SaaS / 移动端 / 开放接口" --> R3["OAuth 2.0 + OIDC"]
Q1 -- "跨组织 / 上下游系统联邦" --> R4["SAML 2.0"]
Q1 -- "企业内网 Web 应用群" --> Q2{"已有统一身份源?"}
Q2 -- "有 AD / LDAP" --> R1["LDAP 做身份源<br/>+ CAS / OIDC 做登录态"]
Q2 -- "无" --> R2["自建认证中心<br/>OIDC 或 CAS"]
选型输入变量归结为四个:
- 应用形态:内网应用群、对外 SaaS、移动端还是开放接口;
- 已有身份源:企业已有 AD/LDAP 时,选型重点变成“协议层选什么”,账号底座直接复用;
- 跨组织需求:是否需要与上下游组织互认身份(联邦场景基本锁定 SAML 或 OIDC);
- 客户端形态:以浏览器为主则 CAS/SAML 皆可,涉及移动端与 API 则倾向 OIDC。
7. 实施风险与注意事项
| 风险点 | 说明 | 应对 |
|---|---|---|
| 认证中心单点故障 | 认证中心成为全系统关键路径,宕机则无人能登录 | 集群化部署 + 会话信息冗余 + 降级预案(已登录局部会话仍可用) |
| 历史应用改造难 | 老系统无标准协议能力,改造成本高 | 接入网关统一代认证,应用零改造 |
| 会话实时性 | 改密、禁用账号后,已发放的局部会话/令牌仍有效 | 局部会话短有效期 + 关键操作回查 + 全局黑名单 |
| 账号治理 | 统一前各系统账号不一致:孤儿账号、重复账号、弱口令 | 先做身份源治理与账号归并,再上 SSO |
| 单点登出残留 | 认证中心已登出,个别应用局部会话仍在 | 双机制登出 + 局部会话短有效期兜底 |
8. 演进路线建议
flowchart LR
P1["阶段一<br/>建成认证中心"] --> P2["阶段二<br/>核心应用全接入"] --> P3["阶段三<br/>安全与运营增强"] --> P4["阶段四<br/>联邦与开放"]
| 阶段 | 目标 | 关键动作 |
|---|---|---|
| 一:建成认证中心 | 竖立统一认证能力 | 选定协议栈,打通身份源,核心认证链路上线 |
| 二:核心应用全接入 | 收敛登录入口 | 新应用强制走标准协议,老应用网关代接入 |
| 三:安全与运营增强 | 从“能用”到“放心用” | MFA 上线、统一审计报表、账号生命周期治理 |
| 四:联邦与开放 | 对外身份互认 | 与上下游组织 SAML/OIDC 互认,开放授权平台 |
附:一页速览
- SSO = 一次认证、处处访问,本质是把认证从各应用剥离、集中到认证中心;
- 认证(你是谁)与授权(你能干什么)是两件事,SSO 只管前者;
- 核心机制是两层会话:全局会话决定要不要再输密码,局部会话决定应用放不放行;
- 协议选择:内网应用群用 CAS / OIDC,移动端与开放场景用 OIDC,跨组织联邦用 SAML,AD/LDAP 是身份底座而非登录协议本身;
- JWT 类令牌“本地验签”带来无状态便利,代价是难作废——必须配短有效期与黑名单;
- 最难的两件事:单点登出(会话最终一致)与认证中心高可用(关键路径不能倒);
- 与多租户的关系:SSO 管身份统一,多租户管数据隔离,叠加才构成“一套系统”的完整体验。