2. SSO协议基础与选型

在企业SSO建设中,协议选型往往决定了后续会话安全治理的上限。很多团队把SAML、OIDC、OAuth 2.0当作可以互换的“登录方式”,结果在会话生命周期、令牌撤销、跨域登出等环节反复踩坑。要做出正确选型,必须先厘清三者的定位差异:OAuth 2.0是授权框架,不是认证协议;OIDC是在OAuth 2.0之上构建的认证层;SAML则是以XML断言为核心的企业级认证与授权标准。理解这一点,才能理解它们各自的会话机制与安全边界。

一、三者的会话机制本质差异

SSO的“会话”实际上由两段组成:身份提供方(IdP)侧的中心会话,以及服务提供方(SP/应用)侧的本地会话。用户首次登录时,IdP建立中心会话并签发凭证;应用验证凭证后建立自己的本地会话。后续访问其他应用时,只要IdP中心会话仍有效,就能免密签发新凭证,这就是SSO的免登基础。

SAML的凭证是XML格式的Assertion断言,通过浏览器POST或Redirect绑定传递。断言中携带NameID、属性声明、Conditions(如NotBefore/NotOnOrAfter)和SubjectConfirmation。SP验证签名后建立本地会话,会话时长通常由SP自己的Cookie决定,与断言有效期解耦——这是SAML会话治理中最容易被忽视的错配点。

OIDC的凭证是ID Token(JWT格式),配合Access Token和Refresh Token使用。ID Token用于认证,Access Token用于访问资源,Refresh Token用于在中心会话有效期内静默续期。OIDC还提供end_session_endpoint和front-channel/logout机制,使跨应用登出比SAML更易实现。

OAuth 2.0本身不定义认证,只定义授权。它通过Access Token让客户端访问受保护资源,但Token不包含“用户是谁”的认证语义。若直接用OAuth 2.0做登录,会引入混淆代理(Confused Deputy)和Token注入风险。因此现代实践中,OAuth 2.0必须与OIDC配合,或至少使用经过严格校验的ID Token。

SAML / OIDC / OAuth 2.0 会话机制与安全边界对比 SAML 2.0 OIDC (OpenID Connect) OAuth 2.0 认证 + 授权标准 XML断言,企业级联邦身份 IdP/SP 双向信任 认证层(构建于OAuth 2.0) ID Token (JWT) 承载身份 REST/JSON 友好,移动端适配 纯授权框架 Access Token 访问资源 不定义“用户是谁” Assertion 断言 NameID + 属性 + Conditions XML签名,浏览器POST传递 ID Token + Access Token JWT签名,含iss/aud/exp/sub Refresh Token 静默续期 Access Token / Refresh Token Bearer Token,无身份语义 Scope 控制资源访问范围 中心会话 + SP本地会话 断言有效期与Cookie解耦 SLO依赖IdP主动通知 中心会话 + 应用会话 end_session_endpoint 登出 Refresh Token 可撤销 Token 生命周期管理 短Access Token + 长Refresh 撤销依赖Token内省 安全边界 XML签名包装攻击(XSW) 断言重放、时钟偏移 SLO实现复杂,易残留会话 安全边界 nonce/state 防重放 ID Token 必须校验 aud/iss/exp 隐式流已废弃,用PKCE 安全边界 不可用于认证! Token泄露、Scope过大 混淆代理、开放重定向 适用场景 传统企业应用、SaaS联邦 已有ADFS/Okta IdP环境 适用场景 现代Web/移动/SPA应用 需要API网关统一认证 适用场景 第三方API授权 资源访问委托(非登录)

二、选型的核心判断维度

选型不是比“谁更先进”,而是看应用形态、身份源现状、安全要求、运维能力四个维度。传统企业内网应用、已有ADFS或Okta等SAML IdP的,继续用SAML成本最低;新建的Web、移动、SPA应用,OIDC是更自然的选择;纯API授权场景,OAuth 2.0的Client Credentials或授权码模式更合适。

一个常见的误区是“新项目一律上OIDC”。如果企业IdP只支持SAML,强行引入OIDC会多出一层协议转换代理,反而增加会话断点和排障难度。反过来,如果应用需要移动端原生体验、需要Refresh Token静默续期,SAML的浏览器重定向模型会非常别扭。

三、会话安全边界的关键控制点

SAML侧最需要关注的是XML签名包装攻击(XSW)。攻击者构造包含多个Assertion的XML,让SP验证了签名正确的那个,却使用了另一个未签名的断言。防御方法是严格按Schema解析、只取签名覆盖范围内的Assertion、禁用DTD。此外,断言有效期(NotOnOrAfter)通常只有几分钟,而SP本地Cookie可能长达数小时,这中间的窗口就是会话治理的盲区。

OIDC侧的核心是ID Token校验完整性。必须校验签名、iss、aud、exp、nonce,缺一不可。很多实现只验签名不验aud,导致其他应用的Token可以拿来登录本应用。授权码流必须配合PKCE,防止授权码拦截。隐式流(Implicit Flow)因Token暴露在URL中,已被OAuth 2.1废弃。

OAuth 2.0侧最危险的是把Access Token当身份凭证。Access Token是给资源服务器看的,不是给登录入口看的。如果登录逻辑只检查“Token有效”就放行,攻击者可以用自己申请的、指向其他用户的Token完成越权登录。正确做法是:认证必须走OIDC的ID Token,OAuth 2.0只负责授权。

安全红线:任何情况下都不要用OAuth 2.0的Access Token直接作为用户身份标识。认证与授权必须分离,这是OIDC存在的根本原因。

四、企业选型决策参考

判断维度 优先SAML 优先OIDC 仅OAuth 2.0
应用形态 传统Web、桌面客户端 SPA、移动App、API网关 纯后端服务间调用
IdP现状 已有ADFS/Okta SAML 已有Azure AD/Keycloak OIDC 无用户登录需求
会话续期 依赖IdP重定向 Refresh Token静默续期 Client Credentials
跨域登出 SLO实现复杂 end_session_endpoint较成熟 不涉及
典型风险 XSW、断言重放 Token校验缺失、PKCE未启用 混淆代理、Scope过大

五、实操建议:从选型到落地

落地时建议先做一次应用清单盘点,按“是否支持OIDC、是否有移动端、是否涉及敏感数据”打标签。对于同时支持SAML和OIDC的IdP(如Azure AD、Okta、Keycloak),新应用优先OIDC,存量SAML应用保持不动,通过IdP统一管理中心会话。这样既避免大规模迁移风险,又能让新应用享受OIDC的会话治理能力。

会话超时策略上,建议IdP中心会话设为8小时(覆盖一个工作日),应用本地会话设为30分钟空闲超时。OIDC应用通过Refresh Token在中心会话有效期内续期,SAML应用则依赖IdP的会话Cookie。两者都要配置绝对超时,防止Refresh Token被无限续期。

排障提示:当用户反馈“登出后还能访问其他应用”时,先检查是IdP中心会话未清除,还是应用本地会话未失效。OIDC看end_session_endpoint是否被调用,SAML看SLO LogoutRequest是否成功送达所有SP。

最后要强调:协议选型只是起点,真正的会话安全取决于令牌校验是否完整、会话超时是否合理、登出是否彻底。SAML、OIDC、OAuth 2.0各有其位,理解它们的会话机制差异,才能在架构设计阶段就把安全边界划清楚。