SAML 2.0
SAML 2.0 是基于 XML 的联邦身份认证协议,广泛用于企业间 SSO 和老系统联邦登录。
#type / concept
#status / evergreen
#tech / security
#resource / http
[!info] related notes
SAML 2.0
一句话定义
SAML 2.0(Security Assertion Markup Language)是基于 XML 的联邦身份认证协议,通过 SAML 断言(Assertion)在身份提供方(IdP)和服务提供方(SP)之间传递用户身份信息。
核心角色
| 角色 | 说明 |
|---|---|
| IdP(Identity Provider) | 身份提供方,负责认证用户并签发 SAML 断言 |
| SP(Service Provider) | 服务提供方,接收并校验 SAML 断言,建立本地会话 |
| Principal | 用户 |
SAML 断言(Assertion)
SAML 的核心产出,XML 格式,包含三类信息:
| 断言类型 | 内容 |
|---|---|
| 认证断言 | 用户何时、通过什么方式认证 |
| 属性断言 | 用户属性(姓名、邮箱、角色等) |
| 授权决策断言 | 用户对某资源是否有权限 |
典型断言示例:
<saml:Assertion>
<saml:Issuer>https://idp.example.com</saml:Issuer>
<saml:Subject>
<saml:NameID>user@example.com</saml:NameID>
</saml:Subject>
<saml:AuthnStatement AuthnInstant="2026-04-01T10:00:00Z">
<saml:AuthnContext>
<saml:AuthnContextClassRef>urn:oasis:names:tc:SAML:2.0:ac:classes:Password</saml:AuthnContextClassRef>
</saml:AuthnContext>
</saml:AuthnStatement>
<saml:AttributeStatement>
<saml:Attribute Name="email">
<saml:AttributeValue>user@example.com</saml:AttributeValue>
</saml:Attribute>
</saml:AttributeStatement>
</saml:Assertion>
登录流程(SP 发起)
1. 用户访问 SP 资源
2. SP 发现未登录,生成 SAML AuthnRequest
3. SP 重定向用户到 IdP(通过浏览器,通常用 HTTP Redirect 或 POST)
4. IdP 认证用户(登录页)
5. 认证成功后,IdP 生成 SAML Response(含 Assertion)
6. IdP 通过浏览器 POST 把 Response 送回 SP 的 ACS(Assertion Consumer Service)
7. SP 校验签名、iss、时间戳等
8. SP 建立本地会话,展示资源
绑定方式(Binding)
SAML 消息通过浏览器传输的方式:
| 绑定 | 方向 | 说明 |
|---|---|---|
| HTTP Redirect | SP → IdP | AuthnRequest 通过 URL 参数传递 |
| HTTP POST | IdP → SP | SAML Response 通过表单 POST 传递 |
| HTTP Artifact | 双向 | 传递引用(artifact)而非完整消息,适合大断言 |
信任模型
SP 和 IdP 之间需要预先交换元数据(Metadata):
- IdP 的公钥证书(用于验签)
- IdP 的 SSO 端点 URL
- SP 的 ACS 端点 URL
- SP 的 entityID
这通常在部署时通过 XML 元数据文件交换完成。
单点登出(SLO)
SAML 定义了单点登出协议:
- Global Logout:IdP 通知所有 SP 登出
- Single Logout:用户从一个 SP 登出,IdP 级联通知其他 SP
通过 Front-Channel(浏览器重定向)或 Back-Channel(SOAP)实现。
优点
- 企业级标准,成熟稳定
- 广泛支持(Okta、Azure AD、OneLogin、各类 SaaS)
- 支持丰富的属性传递
- 联邦身份场景强(跨组织)
缺点
- XML 格式复杂,开发调试困难
- 配置繁琐(证书交换、元数据同步)
- 不如 OIDC 适合现代 Web/App 开发
- 浏览器重定向链路长,用户体验不如 OIDC 流畅
与 OIDC 对比
| 维度 | SAML | OIDC |
|---|---|---|
| 数据格式 | XML | JSON / JWT |
| 复杂度 | 高 | 低 |
| 开发体验 | 繁琐 | RESTful,友好 |
| 适用场景 | 老企业系统、政企、跨组织联邦 | 现代 Web/App/API |
| 生态 | 存量多,稳定 | 活跃,主流 |
选型建议
- 新系统:优先 OIDC
- 老企业系统联邦:可能需要 SAML(很多 SaaS 只支持 SAML)
- 长期方向:向 OIDC 收敛