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 2.0:IdP 与 SP 的断言信任 用户浏览器 携带 AuthnRequest 身份提供方 IdP 签名 Assertion 服务提供方 SP ACS 校验断言 信任锚 IdP 元数据/证书 重定向 POST 断言 验签 OAuth 2.0:授权委托与令牌信任 客户端 client_id/secret 授权服务器 签发 access_token 资源服务器 校验令牌与 scope 信任锚 AS 令牌签名/内省 授权码 Bearer 令牌 验令牌 OpenID Connect:OAuth 2.0 之上的身份层 RP 客户端 scope=openid 校验 nonce/aud OpenID Provider 签发 id_token + access_token UserInfo 端点 返回 sub/email 补充身份声明 信任锚 JWKS 公钥 发现文档 授权请求 id_token 验签

二、信任边界差异:谁在信任什么

三者的信任边界并不在同一层。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/移动登录
选择协议时先问三个问题:需要的是“认证”还是“授权”?信任关系是静态预置还是动态发现?令牌是否需要承载丰富身份属性?答案会直接决定 SAML、OAuth 2.0 或 OIDC 的取舍,而不是简单按新旧程度排序。

最后需要强调,协议只是信任的表达方式,真正的边界由部署决定。同一个 OIDC 部署,若 RP 未校验 aud,其信任边界就比规范要求更宽;同一个 SAML 联邦,若 SP 接受未签名的断言,信任假设就已失效。理解每种协议“信任谁、信任什么、如何验证”,才能在联邦架构中把边界画准、把风险控住。