单点登录(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 挂了是否有"后门"账号或降级方案确保核心业务可用?
相关推荐
忘忧记15 小时前
pytest + YAML + requests`简单实例化
网络·pytest
竹之却15 小时前
如何使用 SakuraFrp 做内网穿透
运维·服务器·网络·frp·内网穿透·sakurafrp
不一样的故事12615 小时前
抓重点、留弹性、重节奏
大数据·网络·人工智能·安全
爱学习的小囧15 小时前
VMware ESXi V7 无 vCenter 虚拟机磁盘缩减攻略:安全释放存储空间(不丢数据)
服务器·网络·windows·安全·esxi·虚拟化
Sgf22715 小时前
第15章 网络编程
开发语言·网络·php
同聘云16 小时前
腾讯云服务器防火墙与网络安全的关系—不可或缺?
服务器·web安全·腾讯云
SPC的存折16 小时前
3、Ansible之playbook模块大全
linux·运维·网络·python
万象.16 小时前
docker镜像操作实操
运维·docker·容器
徐子元竟然被占了!!16 小时前
DNS-特殊域名
运维
智链RFID17 小时前
当企业运营遇到瓶颈:RFID 为什么越来越被采用?
大数据·网络·人工智能·科技·rfid