1. 什么是单点登录

单点登录(SSO,Single Sign-On):用户在多个相互信任的应用系统中,只需登录一次,即可访问所有已授权的系统。

其本质是架构层面的一次职责剥离:

  • 改造前:每个应用各自管理登录页、密码存储、会话——账号分散、密码多处落库、安全策略不统一;
  • 改造后:把“认证”从各应用中抽出来,集中到一个统一认证中心(IdP);应用只负责“拿着凭证去验证身份”,不再接触密码。

SSO 解决的四类问题:

  1. 多系统重复登录的体验问题;
  2. 密码多处存储带来的安全风险面扩大;
  3. 账号分散管理(入离职需到 N 个系统开关账号);
  4. 登录行为审计割裂,无法回答“谁在什么时候访问了什么”。

概念区分:认证(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局部会话,访问放行

流程可归纳为四步:

  1. 发现未登录:应用检查本地会话,不通过则重定向到认证中心;
  2. 集中认证:认证中心完成凭证校验(或复用已有全局会话),签发一次性票据;
  3. 票据换身份:应用在后台用票据向认证中心换取用户身份信息;
  4. 建立局部会话:应用创建自己的会话,后续请求直接放行,不再打扰认证中心。

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["统一门户 / 多租户入口"]

四个组成部分:

  1. 身份源:账号的权威来源(AD/LDAP、本地账号库、第三方),原则是“一处管理、处处同步”;
  2. 认证中心(IdP):承担凭证校验、多因素认证(MFA)、全局会话管理、票据/令牌签发与安全审计;
  3. 应用接入:新应用走标准协议接入;老系统无法改造的,用接入网关统一拦截认证,应用零改造纳入 SSO 管控;
  4. 统一门户:用户的应用入口与工作台,也是多租户场景下“一套系统”体感的载体。

与多租户的关系:实例级多租户方案(统一门户 + 租户独立部署)之所以能让用户感觉“是一套系统”,依赖的正是本篇的统一认证层——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"]

选型输入变量归结为四个:

  1. 应用形态:内网应用群、对外 SaaS、移动端还是开放接口;
  2. 已有身份源:企业已有 AD/LDAP 时,选型重点变成“协议层选什么”,账号底座直接复用;
  3. 跨组织需求:是否需要与上下游组织互认身份(联邦场景基本锁定 SAML 或 OIDC);
  4. 客户端形态:以浏览器为主则 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 管身份统一,多租户管数据隔离,叠加才构成“一套系统”的完整体验。