2. SSO核心原理

2.1 认证中心(Authentication Center)—— SSO的“大脑”

认证中心是SSO体系中最核心的基础设施,所有子系统的登录验证、会话管理、票据签发与校验都依赖它。它本质上是一个独立的认证服务,负责回答三个问题:“你是谁?”(身份验证)、“你能访问什么?”(授权判定)、“你登录过没有?”(会话状态)。

关键职责: 认证中心不参与业务逻辑,只做身份认证与会话管理。所有应用系统通过重定向或API调用与认证中心交互,不直接存储用户密码。

认证中心在SSO架构中的位置如下图所示:

SSO 认证中心核心架构 认证中心 (Authentication Center) 应用系统 A 应用系统 B 应用系统 C 用户 (User) 票据校验/令牌分发 票据校验/令牌分发 登录请求 / 携带票据 认证中心是SSO的信任锚点,所有应用系统都信任认证中心签发的票据,不再各自维护登录状态

2.2 全局会话与局部会话

SSO通过两级会话机制实现“一次登录,到处通行”:全局会话(Global Session) 和 局部会话(Local Session)。理解两者的关系是掌握SSO原理的关键。

对比维度 全局会话(Global Session) 局部会话(Local Session)
存储位置 认证中心(服务端) 各应用系统(服务端)
生命周期 从用户登录到注销,贯穿整个SSO域 从用户访问应用到退出应用,或随全局会话结束
标识方式 全局会话ID(通常与TGT绑定) 局部会话ID(应用自身Session ID)
创建时机 用户首次在认证中心完成身份验证 用户首次访问某个应用,且全局会话已存在
销毁影响 所有局部会话随之失效(单点登出) 仅影响当前应用,全局会话不受影响
典型实现 Redis / 分布式缓存 + Cookie 应用本地内存 / Session存储
工程经验: 全局会话必须使用分布式存储(如Redis集群),避免认证中心单点故障导致全局会话丢失。局部会话可以沿用应用原有的Session机制,降低改造代价。

两级会话的交互流程如下:

全局会话与局部会话交互流程 时间 用户 认证中心 应用A ① 提交凭证 ② 创建全局会话,返回TGT ③ 携带TGT访问应用A ④ 向认证中心校验TGT,获取ST ⑤ 返回服务票据ST 创建局部会话 ⑥ 返回资源,局部会话建立 ⑦ 访问应用B(无需再次登录) 全局会话是SSO的“根会话”,局部会话是“分支会话”。 全局会话存在时,用户访问新应用只需通过票据交换创建局部会话,无需重复输入密码。

2.3 票据(Ticket)机制

票据是SSO体系中传递认证信息的核心载体,本质上是认证中心签发的一段加密数据。不同的票据承担不同的职责,构成完整的信任链。

2.3.1 票据类型与职责

票据类型 全称 用途 生命周期 存储位置
TGT Ticket Granting Ticket 证明用户已通过认证,用于申请服务票据 较长(通常数小时) 认证中心 + 用户Cookie(加密)
ST Service Ticket 允许用户访问特定服务的一次性凭证 极短(通常几分钟) 认证中心签发,应用校验后销毁
PGT Proxy Granting Ticket 允许代理服务代表用户申请其他服务票据 与TGT类似 认证中心 + 代理服务
PT Proxy Ticket 代理服务访问后端服务的凭证 极短(一次性) 认证中心签发,后端服务校验
安全要点: ST必须是一次性使用且有效期极短(建议不超过5分钟),防止票据重放攻击。TGT必须加密存储,且绑定客户端IP或User-Agent等指纹信息,降低劫持风险。

2.3.2 票据交换流程(CAS协议为例)

  1. 用户访问应用A → 应用A检测到无局部会话,重定向到认证中心。
  2. 认证中心验证身份 → 用户提交凭证,认证中心验证通过后创建全局会话,签发TGT(存入Cookie),并生成ST。
  3. ST传递给应用A → 认证中心将ST附加在重定向URL中,用户浏览器携带ST回到应用A。
  4. 应用A校验ST → 应用A通过后台通道(Back Channel)向认证中心验证ST的有效性,验证通过后创建局部会话。
  5. 用户访问应用B → 应用B检测到无局部会话,重定向到认证中心。认证中心检测到TGT(全局会话存在),直接签发新的ST,无需用户再次登录。
// 票据校验的典型后端调用(伪代码)
// 应用系统向认证中心验证ST
POST /cas/serviceValidate
Params: 
  service = https://app.example.com/
  ticket  = ST-12345-abcdef

// 认证中心返回XML/JSON格式的校验结果
Response (成功):
{
  "serviceResponse": {
    "authenticationSuccess": {
      "user": "zhangsan",
      "attributes": {
        "email": "zhangsan@example.com",
        "roles": ["admin", "user"]
      }
    }
  }
}

Response (失败):
{
  "serviceResponse": {
    "authenticationFailure": {
      "code": "INVALID_TICKET",
      "description": "票据 ST-12345-abcdef 无效或已过期"
    }
  }
}

2.4 SSO的信任传递模型

SSO的核心挑战在于:如何让多个互不信任的应用系统,信任同一个认证中心签发的票据? 信任传递模型解决了这个问题,它定义了信任的建立、传递和验证机制。

2.4.1 信任模型分类

信任模型 描述 典型协议 适用场景
直接信任 所有应用系统直接信任认证中心,认证中心是唯一的信任锚点 CAS、SAML 2.0 企业内部SSO,统一管控
层级信任 信任关系形成树状结构,父节点信任子节点,子节点信任父节点 Kerberos 大型组织多域环境
联邦信任 多个组织建立信任联盟,每个组织有自己的认证中心,通过元数据交换建立信任 SAML 2.0、OIDC Federation 跨企业、跨组织的身份联合
Web信任 基于公钥基础设施(PKI)和数字签名,通过证书链建立信任 OAuth 2.0 + JWT 互联网应用、开放平台

2.4.2 直接信任模型(最常用)

在企业SSO场景中,直接信任模型是最主流的方案。所有应用系统在启动时向认证中心注册,获取共享密钥或公钥证书。认证中心签发的票据使用该密钥加密或签名,应用系统通过验证签名来确认票据的真实性。

SSO 直接信任模型 信任锚点 (认证中心) 应用系统 A 应用系统 B 应用系统 C 共享密钥 / 公钥证书 共享密钥 / 公钥证书 信任传递过程: 1. 应用系统启动时向认证中心注册,获取 shared_secret 或公钥证书 2. 认证中心签发票据时使用 shared_secret 加密或私钥签名 3. 应用系统收到票据后,使用 shared_secret 解密或公钥验签 4. 验签通过 → 信任建立;验签失败 → 拒绝访问

2.4.3 信任传递的关键原则

  • 信任不传递原则: 应用系统只信任认证中心,不信任其他应用系统。应用A不能为应用B签发票据,防止横向越权。
  • 最小信任原则: 每个应用系统只拥有验证票据所需的最小密钥信息,不持有认证中心的根密钥。
  • 票据防篡改: 票据必须包含数字签名或MAC(消息认证码),确保传输过程中不被篡改。
  • 时间窗口约束: 票据的有效期必须严格控制,ST通常只有几分钟,TGT不超过数小时,降低泄露风险。
工程落地建议: 推荐使用JWT(JSON Web Token)作为票据格式,利用JWT的签名机制(RS256/HS256)和内置过期时间,天然满足信任传递的安全要求。认证中心使用私钥签名,应用系统使用公钥验签,无需共享对称密钥。

2.5 本章小结

核心概念 一句话总结
认证中心 SSO的信任锚点,统一管理身份认证和票据签发
全局会话 用户登录认证中心后建立的根会话,贯穿整个SSO域
局部会话 用户访问具体应用时建立的会话,依赖全局会话存在
TGT 证明用户已登录的长期票据,用于申请ST
ST 访问特定服务的一次性短期票据,防止重放攻击
信任传递 通过共享密钥或公钥证书,让所有应用系统信任认证中心签发的票据