单点登录(SSO)全景解析:原理、协议对比

1. 引言:为什么 SSO 是现代企业的"身份基石"?

在传统的企业 IT 环境中,用户每访问一个新系统(如 ERP、邮件、OA)都需要输入一次账号密码。这种"身份孤岛"现象带来了显著的现实痛点

  • 用户体验差:记忆数十个复杂密码导致"密码疲劳",频繁登录降低工作效率。
  • 管理成本高:员工入职、离职或调岗时,管理员需在几十个系统中重复同步账号权限,极易出错。
  • 安全风险剧增:为了好记,用户倾向于在所有系统使用弱密码;离职员工账号若未及时清理(孤儿账号),将成为黑客入侵的天然跳板。

单点登录(Single Sign-On, SSO) 的出现解决了上述问题。它允许用户只需在单一入口通过一次身份验证,即可获得访问所有相互信任系统的授权。作为 IAM(Identity and Access Management,身份认证与访问管理)的核心,SSO 不仅是效率工具,更是企业安全的第一道防线。


2. SSO 核心概念与基本原理

在深入协议前,我们必须统一语言。SSO 的本质是建立信任链条

2.1 核心参与者

  • IdP (Identity Provider,身份提供方):认证中心,负责存储用户信息、执行认证(如校验密码、MFA)并签发凭证。
  • SP / RP (Service Provider / Relying Party,服务提供方/依赖方):最终用户要访问的应用系统,它信任 IdP 提供的认证结果。
  • Principal (主体):通常指试图访问资源的用户。

2.2 核心组件

  • Session (会话):用户与 IdP 之间建立的认证状态。
  • Token / Ticket (令牌/票据):一种证明身份的"数字通行证",由 IdP 签发,SP 校验。
  • Trust Domain (信任域):共享认证信息的系统集合。

2.3 基本逻辑流

  1. 用户访问 SP,SP 发现用户未登录。
  2. SP 将用户重定向(Redirect)至 IdP。
  3. 用户在 IdP 完成登录,IdP 生成票据并通过浏览器传回 SP。
  4. SP 拿着票据去 IdP 验证合法性(或通过公钥自验)。
  5. 验证通过,SP 建立本地会话。

3. 主流 SSO 协议深度对比

不同的业务场景决定了协议的选择。

维度 CAS (v2/v3) SAML 2.0 OIDC (OAuth 2.0 + OpenID) Kerberos
定位 经典 Web SSO 协议 企业级联合身份认证 现代互联网身份层 局域网/域控认证
票据形式 Ticket (ST/TGT) XML Assertion JSON Web Token (JWT) 二进制 Ticket
传送方式 浏览器重定向 + 后端校验 浏览器 POST (XML) 授权码流/隐式流 SPNEGO/GSSAPI
适用场景 传统高校、企业内部 Web 跨组织 B2B、SaaS 继承 移动端、SPA、API 保护 Windows 域环境
安全特性 依赖后端验证 XML 签名与加密 非对称加密签名、PKCE 对称加密、防重放
复杂度 中等 高(XML 处理复杂) 中(对开发者友好) 极高(需特定客户端支持)
移动端支持 较差 原生支持(极佳) 基本无

4. 经典协议流程深度解析

4.1 CAS (Central Authentication Service) 流程

CAS 是早期的行业标准,其核心是多级票据模型。

  • TGT (Ticket Granting Ticket):存储在 IdP Cookie 中,代表用户的 SSO 会话。
  • ST (Service Ticket):IdP 发给 SP 的一次性票据。
  • PGT (Proxy Granting Ticket):用于代理访问,解决 A 系统调用 B 系统时的身份透传。

登录时序:

  1. 用户访问 App -> 302 重定向到 CAS Server。
  2. CAS 校验 TGT(若无则要求登录)。
  3. CAS 产生 ST,重定向回 App:https://app.com?ticket=ST-xxxx
  4. 后端校验 :App 后端携带 ST 请求 CAS serviceValidate 接口。
  5. CAS 返回用户信息 XML,App 建立本地会话。

4.2 SAML 2.0 (Security Assertion Markup Language)

SAML 最大的特点是**"去中心化验证"**。SP 不需要像 CAS 那样再回连 IdP 校验,而是通过预先交换的公钥直接解析 XML 签名。

  • SP-Initiated (SP 发起) :用户先访问应用,应用生成 AuthnRequest 发给 IdP。
  • IdP-Initiated (IdP 发起) :用户先登录门户,点击应用图标,IdP 直接推给应用一个 SAMLResponse

4.3 OIDC (OpenID Connect)

OIDC 是在 OAuth 2.0 授权协议之上增加的身份层。

核心流程(授权码流 + PKCE):

  1. Code 交换 :App 请求 /authorize 获取 code
  2. PKCE 加固 :移动端使用 code_challenge 防止 code 被截获。
  3. Token 兑换 :App 在后端用 code 换取 id_token (身份) 和 access_token (授权)。
go 复制代码
// OIDC Token 校验伪代码 (Golang)
func validateIDToken(rawIDToken string) (*claims, error) {
    // 1. 验证签名 (RS256)
    // 2. 验证 iss (发行人) 是否匹配
    // 3. 验证 aud (客户端ID) 是否匹配
    // 4. 验证 exp (过期时间)
    return parseJWT(rawIDToken)
}

5. 安全风险与加固清单

SSO 是一把双刃剑:一旦 IdP 失陷,全线崩盘。

5.1 传输与会话安全 (Critical)

  • TLS & HSTS:强制全站 HTTPS。开启 HSTS (HTTP Strict Transport Security) 防止降级攻击。
  • Cookie 属性
  • HttpOnly: 防止 XSS 窃取。
  • Secure: 仅 HTTPS 传输。
  • SameSite=Lax/Strict: 防范 CSRF 攻击。
  • Partitioned (CHIPS): 应对现代浏览器的第三方 Cookie 限制。

5.2 票据管理 (High)

  • 短生命周期 :ST 或 Code 必须是一次性且有效期极短(通常 < 5分钟)。
  • Token Rotation (刷新令牌滚动):Refresh Token 使用一次后即废弃并下发新的,防止长期令牌泄露。

5.3 来源校验 (High)

  • 重定向白名单 :这是最常见的漏洞(Open Redirect)。必须在 IdP 端严格校验 redirect_uri,禁止使用通配符。
  • Referer/Origin 校验:防止跨站请求伪造。

5.4 纵深防御 (Medium)

  • MFA (多因素认证):针对高敏感应用强制触发 TOTP 或 FIDO2 校验。
  • 异常行为分析:同一账号在 1 分钟内异地登录(Impossible Travel)时强制阻断并告警。

6. 总结与 Checklist

SSO 的成功实施不仅在于选对协议,更在于后期的精细化运维。

运维 Checklist

  • 元数据管理:SAML 证书是否即将在 30 天内过期?
  • 日志审计 :是否记录了所有 login_successlogin_failed 以及 token_exchange 日志?
  • SLO (Single Log-Out):用户注销 IdP 时,子系统是否能同步清理会话?(这是技术难点,建议配合后端短 Session 机制)。
  • 监控告警:IdP 接口响应延迟是否超过 500ms?
  • 灾备:IdP 挂了是否有"后门"账号或降级方案确保核心业务可用?
相关推荐
小同志002 小时前
简单了解 JVM
网络·jvm
旖旎夜光2 小时前
Linux(14)(上)
linux·网络
白太岁2 小时前
通信:(2) TCP/UDP、流量/拥塞控制、ARP 与 Socket 应用
网络·c++·tcp/ip·udp
nnbulls12 小时前
Linux环境下Tomcat的安装与配置详细指南
linux·运维·tomcat
源力祁老师2 小时前
Odoo ORM 将 Python 查询意图编译为 SQL 的逐函数讲解(Odoo 19)
java·服务器·数据库
那我掉的头发算什么2 小时前
【图书管理系统】基于Spring全家桶的图书管理系统(上)
java·服务器·数据库·spring boot·后端·spring·mybatis
wsad05322 小时前
Linux Shell脚本执行方式全解析:source、点号、路径、bash与exec的区别
linux·运维·bash·shell
草莓熊Lotso2 小时前
Linux 磁盘基础:从物理结构到 CHS/LBA 寻址,吃透数据存储底层逻辑
linux·运维·服务器·c++·人工智能
叠叠乐2 小时前
EasyTier 免费自建自用5$每个月的服务器
linux·运维·bash