身份提供商(IdP)基础:SAML 2.0与OIDC/OAuth 2.0协议详解

聊到多云身份治理,第一个绕不开的话题就是身份提供商(IdP)。说白了,IdP就是那个负责“发身份证”和“验票”的中心节点。你在阿里云、AWS、Azure之间来回切换,总得有个统一的“大管家”来证明你是谁。

我最早接触IdP是在2016年,当时帮一家金融客户做混合云迁移。他们内部有十几个应用,每个都自己维护一套密码。嗯,那场面,光是密码重置工单就堆满了IT部门的桌面。后来我们上了统一的IdP,问题才真正解决。

这一章,我们重点拆解两个最主流的协议:SAML 2.0和OIDC/OAuth 2.0。顺便聊聊市面上主流的IdP产品怎么选。

SAML 2.0协议详解

SAML 2.0,全称Security Assertion Markup Language。名字挺长,但核心逻辑很简单:用户向IdP登录,IdP给服务提供商(SP)发一个“断言”,证明用户是谁、有什么权限。

我在项目中遇到过不少团队把SAML和SSO直接划等号。其实SAML只是SSO的一种实现方式,而且它主要面向企业级Web应用。你想想看,Salesforce、Workday、Office 365这些老牌SaaS,几乎都支持SAML 2.0。

SAML 2.0的核心流程(SP-Initiated SSO):

  1. 用户访问SP(比如Salesforce)的受保护资源。
  2. SP发现用户未认证,生成SAML认证请求(AuthnRequest),重定向到IdP。
  3. 用户在IdP登录(如果已有会话则跳过)。
  4. IdP生成SAML断言(Assertion),通过HTTP POST或Artifact方式返回给SP。
  5. SP验证断言签名,解析用户属性,建立本地会话。

这里有个关键点:SAML断言是XML格式的,而且必须签名。我见过有人为了省事,把签名验证关掉——结果被中间人攻击,用户身份被冒用。千万别这么干。

避坑指南:我曾经在项目里遇到SAML断言超时问题。默认的断言有效期通常是5分钟,但有些IdP和SP的时钟偏差超过30秒就会失败。建议把时钟偏差放宽到120秒,同时确保NTP同步。

SAML 2.0的缺点也很明显:协议重、解析慢、移动端支持差。XML解析在浏览器里还好,但在原生App里就非常痛苦。所以后来OIDC才逐渐成为主流。

OIDC/OAuth 2.0协议详解

OAuth 2.0本身不是身份认证协议,它是授权协议。但OIDC(OpenID Connect)在OAuth 2.0之上加了一层身份认证层,变成了真正的“认证+授权”协议。

我个人习惯把OAuth 2.0比作“酒店房卡”——它只告诉门卫你能进哪个房间,但不证明你是谁。而OIDC就是“身份证+房卡”——它既证明你是谁,又告诉你有什么权限。

OAuth 2.0的四种授权模式

授权模式 适用场景 安全级别
授权码模式(Authorization Code) Web后端应用、有Server端的App 高
隐式模式(Implicit) 纯前端SPA(已不推荐) 低
密码模式(Resource Owner Password) 高度信任的第一方应用 中
客户端凭证模式(Client Credentials) 服务间通信、M2M场景 高

你想想看,现在谁还用隐式模式?我上次见到它还是在2019年的一个遗留系统里。现在主流做法是授权码模式 + PKCE,连SPA都这么用。

OIDC的核心概念

OIDC在OAuth 2.0的基础上引入了几个新东西:

  • ID :JWT格式,包含用户身份信息(iss、sub、aud、exp等)。
  • UserInfo Endpoint:获取用户详细信息的API。
  • Scope:openid是必须的,profile、email、address等是可选。

小技巧:我在做多云身份治理时,习惯把ID 的sub字段作为用户的全局唯一标识。但要注意,不同IdP的sub格式可能不同——比如Azure AD是UUID,Okta是随机字符串。建议在IdP侧配置统一的NameID格式。

OIDC的流程比SAML轻量得多。一个典型的授权码流程只需要两次HTTP请求(一次获取code,一次换取),而SAML至少需要三次重定向。这也是为什么现代云原生应用几乎都选OIDC。

SAML 2.0 vs OIDC/OAuth 2.0

对比维度 SAML 2.0 OIDC/OAuth 2.0
消息格式 XML(签名+加密) JWT(JSON)
传输方式 HTTP POST / Redirect / Artifact HTTP POST / Redirect / 直接API调用
移动端支持 差(XML解析慢) 好(JWT轻量)
API友好度 低(需解析XML) 高(原生JSON)
单点登出(SLO) 支持(但实现复杂) 支持(通过RP-Initiated Logout)
主流场景 企业SaaS、传统Web应用 移动App、SPA、微服务、云原生

我个人建议:新项目优先选OIDC,除非你对接的是Salesforce、Workday这类老牌SaaS。它们对SAML的支持更成熟,OIDC反而可能遇到兼容性问题。

主流IdP产品对比

市面上主流的IdP产品,我基本都用过。下面这张表是我个人的使用感受:

产品 协议支持 多云集成 成本 我的评价
Azure AD SAML 2.0, OIDC, WS-Fed Azure + AWS + GCP 随E3/E5订阅 微软生态首选,但SCIM配置略复杂
Okta SAML 2.0, OIDC, SCIM 7000+预集成应用 按用户/月 集成最广,但价格偏高
Auth0 OIDC, OAuth 2.0, SAML 开发者友好 按月活跃用户 适合自定义场景,但企业版不便宜
Keycloak SAML 2.0, OIDC, OAuth 2.0 开源,可自托管 免费 功能强大,但运维成本高
PingIdentity SAML 2.0, OIDC, WS-Fed 大型企业 按用户/年 适合复杂企业策略,但学习曲线陡

我的选择建议:

  • 如果你已经在用微软全家桶,Azure AD是顺理成章的选择。
  • 如果你需要快速集成大量SaaS应用,Okta的预集成库能省很多事。
  • 如果你是创业公司或开发者团队,Auth0的开发者体验最好。
  • 如果你预算有限且有人力运维,Keycloak是开源界的王者。

嗯,这里要注意:不要只看功能,还要看生态。我见过一个团队选了冷门IdP,结果对接AWS IAM Identity Center时发现不支持SCIM,最后只能手动同步用户——那叫一个痛苦。

知识体系总览

下面这张图,是我对本章核心逻辑的梳理。你可以把它当作一个“导航图”:

身份提供商(IdP)协议与产品知识体系 身份提供商 (IdP) SAML 2.0 OIDC / OAuth 2.0 XML断言 SP-Initiated SSO IdP-Initiated SSO SLO单点登出 ID (JWT) 授权码+PKCE UserInfo端点 Client Credentials 主流IdP产品:Azure AD | Okta | Auth0 | Keycloak | PingIdentity 新项目优先选OIDC,对接企业SaaS用SAML 产品选择看生态,不要只看功能

这张图把SAML和OIDC的核心子概念、以及主流IdP产品串在了一起。你可以看到,协议选择决定了技术架构,产品选择决定了运维复杂度。两者需要一起考虑。

我的个人习惯:在做多云身份治理方案时,我会先画一张类似的图,把协议、产品、集成方式都标出来。这样团队讨论时,大家一眼就能看到全貌,不会在细节里迷失。

好了,这一章的内容就到这里。SAML和OIDC的细节其实还有很多,比如SAML的Metadata交换、OIDC的Discovery和JWKS端点——这些我们在后面的章节里会逐一展开。你现在只需要记住:SAML重、稳、老;OIDC轻、快、新。选哪个,看你的场景。