2. 身份联邦协议与信任模型
身份联邦的本质,是让一个域中的身份断言被另一个域接受。协议只是载体,真正决定安全边界的是“谁信任谁、信任什么、信任多久、信任失效后怎么办”。SAML、OAuth 2.0 与 OpenID Connect(OIDC)常被并列讨论,但它们解决的问题并不相同:SAML 与 OIDC 解决的是“认证结果如何跨域传递”,OAuth 2.0 解决的是“授权如何委托”。把三者混为一谈,是信任边界设计中最常见的起点错误。
一、三种协议的核心流程与信任假设
SAML 2.0 采用“身份提供方(IdP)—服务提供方(SP)”模型。用户访问 SP 时,SP 生成 AuthnRequest 并将浏览器重定向到 IdP;IdP 完成认证后,生成包含 Assertion 的响应,经浏览器 POST 回 SP 的断言消费服务(ACS)。SP 验证签名、受众、时间窗与 InResponseTo 后建立本地会话。其信任假设是:SP 信任 IdP 的签名密钥与元数据,且 IdP 的认证策略满足 SP 的保证等级。SAML 断言通常承载姓名、邮箱、角色等属性,适合企业 SSO 与跨组织联邦。
OAuth 2.0 的核心是授权委托,而非认证。资源所有者授权客户端,客户端从授权服务器换取访问令牌,再以令牌访问资源服务器。授权码模式中,客户端先拿 code,再用 code 加客户端凭证换 access_token。OAuth 2.0 的信任假设是:资源服务器信任授权服务器签发的令牌,客户端信任授权服务器的端点与 TLS 通道。它不规定用户身份如何表达,因此“用 OAuth 做登录”本身并不成立,必须叠加身份层。
OpenID Connect 在 OAuth 2.0 之上增加身份层。它在授权请求中携带 scope=openid,授权服务器返回 id_token(JWT),其中包含 iss、sub、aud、exp、nonce 等声明。客户端通过校验签名、iss、aud、exp 与 nonce 来确认身份。OIDC 的信任假设是:客户端信任 OP 的 JWKS 公钥与发现文档,且 id_token 的受众必须精确匹配自身客户端 ID。
二、信任边界差异:谁在信任什么
三者的信任边界并不在同一层。SAML 的信任边界落在“IdP 与 SP 之间”,SP 必须预先配置 IdP 的元数据与签名证书,信任关系是静态、双向、可审计的。OAuth 2.0 的信任边界落在“授权服务器与资源服务器之间”,资源服务器通常通过令牌内省或 JWT 验签来确认令牌有效性,客户端本身并不被资源服务器直接信任。OIDC 的信任边界则落在“OP 与 RP 之间”,RP 通过 JWKS 与发现文档动态获取公钥,信任关系更接近“可发现、可轮换”的模型。
从令牌形态看,SAML 使用 XML 断言,签名覆盖整个断言,属性丰富但体积大;OAuth 2.0 的访问令牌通常是不透明字符串或 JWT,资源服务器只关心权限范围;OIDC 的 id_token 是 JWT,必须校验 iss、aud、exp、nonce 与签名。一个常见误区是:把 OAuth 2.0 的 access_token 当作身份凭证。访问令牌只证明“被授权访问某资源”,不证明“用户是谁”。若业务需要身份,应使用 OIDC 的 id_token,或通过 UserInfo 端点获取身份声明。
三、信任假设失效时的风险与治理要点
信任假设一旦被打破,协议本身不会自动兜底。SAML 中,若 SP 未校验 InResponseTo 或未限制断言受众,攻击者可将合法 IdP 签发的断言重放到另一个 SP,形成断言重放。OAuth 2.0 中,若客户端未校验 state,授权码可能被注入到攻击者会话;若资源服务器只解析 JWT 而不验签,攻击者可伪造令牌。OIDC 中,若 RP 未校验 nonce 或 aud,id_token 可能被重放或跨客户端使用。
治理上应把握三条主线:第一,信任锚必须可轮换、可吊销,SAML 证书与 OIDC JWKS 都要有轮换窗口和回滚方案;第二,令牌校验必须完整,签名、受众、时效、随机数缺一不可;第三,信任边界要显式声明,明确哪些域、哪些客户端、哪些资源在信任范围内,避免“默认信任”。下面给出一份可直接用于评审的协议信任边界检查表,字段按实际联邦场景设计。
| 检查项 | SAML 2.0 | OAuth 2.0 | OpenID Connect |
|---|---|---|---|
| 信任锚 | IdP 元数据与签名证书 | 授权服务器令牌签名/内省端点 | OP 的 JWKS 与发现文档 |
| 必须校验 | 签名、受众、时间窗、InResponseTo | 令牌有效性、scope、过期时间 | 签名、iss、aud、exp、nonce |
| 典型风险 | 断言重放、受众混淆 | 授权码注入、令牌伪造 | id_token 重放、跨客户端使用 |
| 信任关系更新 | 手动更新元数据/证书 | 轮换客户端密钥与令牌密钥 | JWKS 自动轮换 |
| 适用场景 | 企业 SSO、跨组织联邦 | API 授权、第三方资源访问 | 社交登录、现代 Web/移动登录 |
最后需要强调,协议只是信任的表达方式,真正的边界由部署决定。同一个 OIDC 部署,若 RP 未校验 aud,其信任边界就比规范要求更宽;同一个 SAML 联邦,若 SP 接受未签名的断言,信任假设就已失效。理解每种协议“信任谁、信任什么、如何验证”,才能在联邦架构中把边界画准、把风险控住。