2. SSO核心原理
2.1 认证中心(Authentication Center)—— SSO的“大脑”
认证中心是SSO体系中最核心的基础设施,所有子系统的登录验证、会话管理、票据签发与校验都依赖它。它本质上是一个独立的认证服务,负责回答三个问题:“你是谁?”(身份验证)、“你能访问什么?”(授权判定)、“你登录过没有?”(会话状态)。
关键职责: 认证中心不参与业务逻辑,只做身份认证与会话管理。所有应用系统通过重定向或API调用与认证中心交互,不直接存储用户密码。
认证中心在SSO架构中的位置如下图所示:
2.2 全局会话与局部会话
SSO通过两级会话机制实现“一次登录,到处通行”:全局会话(Global Session) 和 局部会话(Local Session)。理解两者的关系是掌握SSO原理的关键。
| 对比维度 | 全局会话(Global Session) | 局部会话(Local Session) |
|---|---|---|
| 存储位置 | 认证中心(服务端) | 各应用系统(服务端) |
| 生命周期 | 从用户登录到注销,贯穿整个SSO域 | 从用户访问应用到退出应用,或随全局会话结束 |
| 标识方式 | 全局会话ID(通常与TGT绑定) | 局部会话ID(应用自身Session ID) |
| 创建时机 | 用户首次在认证中心完成身份验证 | 用户首次访问某个应用,且全局会话已存在 |
| 销毁影响 | 所有局部会话随之失效(单点登出) | 仅影响当前应用,全局会话不受影响 |
| 典型实现 | Redis / 分布式缓存 + Cookie | 应用本地内存 / Session存储 |
工程经验: 全局会话必须使用分布式存储(如Redis集群),避免认证中心单点故障导致全局会话丢失。局部会话可以沿用应用原有的Session机制,降低改造代价。
两级会话的交互流程如下:
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协议为例)
- 用户访问应用A → 应用A检测到无局部会话,重定向到认证中心。
- 认证中心验证身份 → 用户提交凭证,认证中心验证通过后创建全局会话,签发TGT(存入Cookie),并生成ST。
- ST传递给应用A → 认证中心将ST附加在重定向URL中,用户浏览器携带ST回到应用A。
- 应用A校验ST → 应用A通过后台通道(Back Channel)向认证中心验证ST的有效性,验证通过后创建局部会话。
- 用户访问应用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场景中,直接信任模型是最主流的方案。所有应用系统在启动时向认证中心注册,获取共享密钥或公钥证书。认证中心签发的票据使用该密钥加密或签名,应用系统通过验证签名来确认票据的真实性。
2.4.3 信任传递的关键原则
- 信任不传递原则: 应用系统只信任认证中心,不信任其他应用系统。应用A不能为应用B签发票据,防止横向越权。
- 最小信任原则: 每个应用系统只拥有验证票据所需的最小密钥信息,不持有认证中心的根密钥。
- 票据防篡改: 票据必须包含数字签名或MAC(消息认证码),确保传输过程中不被篡改。
- 时间窗口约束: 票据的有效期必须严格控制,ST通常只有几分钟,TGT不超过数小时,降低泄露风险。
工程落地建议: 推荐使用JWT(JSON Web Token)作为票据格式,利用JWT的签名机制(RS256/HS256)和内置过期时间,天然满足信任传递的安全要求。认证中心使用私钥签名,应用系统使用公钥验签,无需共享对称密钥。
2.5 本章小结
| 核心概念 | 一句话总结 |
|---|---|
| 认证中心 | SSO的信任锚点,统一管理身份认证和票据签发 |
| 全局会话 | 用户登录认证中心后建立的根会话,贯穿整个SSO域 |
| 局部会话 | 用户访问具体应用时建立的会话,依赖全局会话存在 |
| TGT | 证明用户已登录的长期票据,用于申请ST |
| ST | 访问特定服务的一次性短期票据,防止重放攻击 |
| 信任传递 | 通过共享密钥或公钥证书,让所有应用系统信任认证中心签发的票据 |