OAuth 2.0、SAML 与 SSO
联合身份与单点登录(SSO)如何运作、常见流程(OAuth 2.0 / OIDC / SAML)、风险模式与缓解。
快速解答
OAuth 2.0 委托授权,OpenID Connect 增加身份,SAML 提供基于 XML 的 SSO;通过校验签发方/受众/令牌签名、使用 PKCE、短生命周期令牌并且绝不记录令牌来保护它们。
定义
OAuth 2.0 授予委托授权,OpenID Connect 在 OAuth 之上叠加身份验证,而 SAML 交换 XML 断言以实现 Web SSO;它们共同实现了跨依赖方的单点登录。
它是什么
身份联合使用户只需向身份提供方(IdP)进行一次身份验证,即可在许多应用间复用该身份——即单点登录(SSO)。OAuth 2.0 委托授权;OpenID Connect(OIDC)在其上叠加身份验证;SAML 交换签名的 XML 断言,通常用于企业 Web SSO。
为什么重要
联合将信任集中:一个 IdP,众多依赖方。一处配置错误(未校验断言便予以接受、信任可被伪造的受众,或窃取的令牌)会危害每一个连接的应用。这些是真实数据泄露中常见的根本原因。
它如何工作
- OAuth 2.0:资源所有者向客户端授予授权码/令牌,以代表其行事。PKCE 将授权码交换绑定到已验证的客户端,以阻止拦截。
- OIDC:返回一个 ID Token(JWT,参见
guides:decode-jwt-safely),用以证明用户身份。依赖方必须校验签发方、受众、签名和有效期。 - SAML 2.0:IdP 向 SP 发送签名的 XML 断言。必须验证签名,校验 AudienceRestriction 和 NotOnOrAfter 条件。
检测
- SSO 令牌/断言来自意外的签发方或受众却被接受。
- 授权码拦截模式(缺少 PKCE、令牌出现在 URL 中)。
- 单个主体的首次 SSO 登录数量骤增(令牌重放)。
缓解
- 对公共客户端始终使用 PKCE;对每个令牌/断言校验签发方、受众、签名和有效期。
- 优先使用短生命周期、限定作用域的令牌;轮换机密;不要记录令牌或断言。
- 在 IdP 集中执行 MFA(参见
security:identity-mfa)。
调查
捕获令牌/断言的元数据(签发方、受众、有效期、签名密钥)以及 SP 的校验日志,以确定是否接受了未签名/未校验的断言。关于如何安全地解码和检查 JWT,参见 guides:tool-jwt-guide。