SAML全称为Security Assertion Markup Language,也就是安全断言标记语言,是由结构化信息标准促进组织制定的基于XML的开放标准,核心作用是实现不同安全域之间的身份信息共享,最常见的应用就是单点登录场景。

SAML的核心概念
SAML的核心是断言,也就是一方对另一方的身份、权限等信息的声明。断言分为三种类型:
- 身份验证断言:证明用户已经完成身份验证,包含认证时间、认证方式等信息
- 属性断言:传递用户的属性信息,比如用户ID、邮箱、所属部门等
- 授权决策断言:说明用户是否有权限执行某个操作或者访问某个资源
SAML的参与角色
一个完整的SAML流程涉及三个核心角色:
- 用户(Principal):需要访问服务的主体,通常是普通用户
- 身份提供者(IdP,Identity Provider):负责验证用户身份,生成并发送SAML断言的一方,比如企业内部的统一身份认证系统
- 服务提供者(SP,Service Provider):接收SAML断言,为用户提供具体服务的系统,比如企业使用的第三方办公软件、内部业务系统
SAML单点登录的基本流程
以用户访问SP服务为例,SAML单点登录的典型流程如下:
- 用户尝试访问SP提供的受保护资源,SP检测到用户未登录,生成SAML认证请求
- SP将认证请求重定向到IdP的认证端点,请求中通常包含SP的标识信息
- IdP接收到请求后,验证用户身份,如果用户未登录则引导用户完成登录操作
- IdP生成包含用户身份信息的SAML断言,使用私钥对断言进行签名,可选对断言内容进行加密
- IdP将断言返回给SP,通常通过浏览器跳转的方式传递
- SP接收到断言后,验证签名的有效性,解析断言内容,确认用户身份后为用户创建会话,允许其访问对应资源
SAML断言示例
下面是一个简化版的SAML身份验证断言示例,实际生产环境中的断言会包含更多标准字段和签名信息:
<saml:Assertion xmlns:saml="urn:oasis:names:tc:SAML:2.0:assertion"
ID="_8e8dc5f69a98cc4c1ff3427e5ce346c0"
Version="2.0"
IssueInstant="2024-05-20T12:00:00Z">
<saml:Issuer>https://idp.ippipp.com</saml:Issuer>
<saml:Subject>
<saml:NameID Format="urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress">user@ipipp.com</saml:NameID>
</saml:Subject>
<saml:Conditions NotBefore="2024-05-20T12:00:00Z" NotOnOrAfter="2024-05-20T12:30:00Z">
<saml:AudienceRestriction>
<saml:Audience>https://sp.ippipp.com</saml:Audience>
</saml:AudienceRestriction>
</saml:Conditions>
<saml:AuthnStatement AuthnInstant="2024-05-20T12:00:00Z">
<saml:AuthnContext>
<saml:AuthnContextClassRef>urn:oasis:names:tc:SAML:2.0:ac:classes:Password</saml:AuthnContextClassRef>
</saml:AuthnContext>
</saml:AuthnStatement>
</saml:Assertion>
SAML与其他身份认证方案的对比
很多人会混淆SAML和OAuth、OpenID Connect的差异,三者的核心定位不同:
| 方案 | 核心作用 | 适用场景 | 数据格式 |
|---|---|---|---|
| SAML | 身份断言交换,实现单点登录 | 企业级系统间身份互通、传统Web应用单点登录 | XML |
| OAuth 2.0 | 授权委托,允许第三方应用访问用户资源 | 第三方应用获取用户授权访问API、移动端应用授权 | JSON(通常配合JWT使用) |
| OpenID Connect | 基于OAuth 2.0的身份认证层 | 现代Web应用、移动端应用的身份认证 | JSON |
SAML的常见应用场景
SAML最典型的应用就是企业级单点登录,比如企业员工只需要登录一次企业统一身份认证系统,就可以直接访问企业采购的第三方SaaS服务、内部开发的各种业务系统,不需要在每个系统单独输入账号密码。另外,云服务之间的身份互通、跨组织的合作系统身份共享也会用到SAML技术。
使用SAML的注意事项
- 断言的签名和加密必须使用安全的算法,避免断言被篡改或者泄露
- IdP和SP之间的元数据需要定期同步更新,防止过期证书导致认证失败
- 断言的有效期需要设置合理,避免过长的有效期带来安全风险
- 做好IdP的高可用部署,IdP故障会导致所有依赖它的SP服务都无法登录