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 RedirectSP → IdPAuthnRequest 通过 URL 参数传递
HTTP POSTIdP → SPSAML 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 对比

维度SAMLOIDC
数据格式XMLJSON / JWT
复杂度
开发体验繁琐RESTful,友好
适用场景老企业系统、政企、跨组织联邦现代 Web/App/API
生态存量多,稳定活跃,主流

选型建议

  • 新系统:优先 OIDC
  • 老企业系统联邦:可能需要 SAML(很多 SaaS 只支持 SAML)
  • 长期方向:向 OIDC 收敛

参考

创建于 2026/4/1 更新于 2026/5/27