IDP门户SAML与JWT签名可信验证 - 第4节

4.1 SAML 协议核心概念

SAML(Security Assertion Markup Language)是基于 XML 的开放标准,用于在身份提供商(IdP)和服务提供商(SP)之间交换身份验证与授权数据。在 IDP 门户签名证据校验场景中,SAML 断言是承载用户身份与签名信息的核心载体。

4.1.1 SAML 断言(Assertion)

SAML 断言是 IdP 向 SP 签发的一段安全声明,包含三类主要信息:

断言类型 说明 典型元素
身份验证断言 证明用户已通过某种方式认证 AuthnStatement、AuthnContext
属性断言 携带用户属性信息 AttributeStatement、Attribute
授权决策断言 指示用户是否有权访问某资源 AuthzDecisionStatement、Action
签名校验关键点: 断言中的 ds:Signature 元素位于 <Assertion> 内部,使用 IdP 私钥签名,SP 用 IdP 公钥验证。签名覆盖整个断言内容(不含签名自身),确保断言在传输中未被篡改。

4.1.2 SAML 断言结构示例

<saml:Assertion
    xmlns:saml="urn:oasis:names:tc:SAML:2.0:assertion"
    ID="_a1b2c3d4e5f6"
    IssueInstant="2025-03-21T10:00:00Z">
  <saml:Issuer>https://idp.example.com</saml:Issuer>
  <ds:Signature>
    <ds:SignedInfo>
      <ds:CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"/>
      <ds:SignatureMethod Algorithm="http://www.w3.org/2001/04/xmldsig-more#rsa-sha256"/>
      <ds:Reference URI="#_a1b2c3d4e5f6">
        <ds:Transforms>
          <ds:Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature"/>
        </ds:Transforms>
        <ds:DigestMethod Algorithm="http://www.w3.org/2001/04/xmlenc#sha256"/>
        <ds:DigestValue>...</ds:DigestValue>
      </ds:Reference>
    </ds:SignedInfo>
    <ds:SignatureValue>...</ds:SignatureValue>
  </ds:Signature>
  <saml:Subject>
    <saml:NameID Format="urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress">user@example.com</saml:NameID>
  </saml:Subject>
  <saml:Conditions NotBefore="2025-03-21T09:55:00Z" NotOnOrAfter="2025-03-21T10:05:00Z"/>
  <saml:AuthnStatement AuthnInstant="2025-03-21T09:59:00Z">
    <saml:AuthnContext>
      <saml:AuthnContextClassRef>urn:oasis:names:tc:SAML:2.0:ac:classes:PasswordProtectedTransport</saml:AuthnContextClassRef>
    </saml:AuthnContext>
  </saml:AuthnStatement>
</saml:Assertion>

4.2 SAML 请求与响应

SAML 协议定义了两种核心消息类型:SAML 请求(由 SP 发起)和 SAML 响应(由 IdP 返回)。在 Web 浏览器 SSO 场景中,SP 通过 AuthnRequest 请求认证,IdP 通过 Response 返回断言。

4.2.1 主要消息类型对比

消息类型 发起方 目的 签名位置
AuthnRequest SP 请求 IdP 对用户进行身份验证 消息体或协议绑定层
LogoutRequest SP 或 IdP 发起单点登出 消息体
Response IdP 返回认证结果及断言 消息体或断言内部
LogoutResponse IdP 或 SP 确认登出操作 消息体
实战提示: 在 IDP 门户签名校验中,Response 消息可能包含双重签名——消息级签名(<ds:Signature> 作为 Response 子元素)和断言级签名(<ds:Signature> 作为 Assertion 子元素)。校验时需分别验证。

4.3 SAML 绑定方式

SAML 绑定定义了如何将 SAML 消息嵌入到通信协议中。Web SSO 场景最常用的三种绑定方式:HTTP Redirect、HTTP POST 和 Artifact。

4.3.1 三种绑定方式对比

绑定方式 传输载体 消息可见性 大小限制 典型使用场景
HTTP Redirect URL 查询参数 明文(URL 可见) 受 URL 长度限制(约 2KB) SP → IdP 的 AuthnRequest
HTTP POST HTML 表单 明文(可查看页面源码) 无严格限制 IdP → SP 的 Response(含断言)
Artifact URL 查询参数 + 后端通道 仅 artifact 标识可见 极小(仅 artifact 值) 高安全场景,避免断言暴露在浏览器

4.3.2 HTTP Redirect 绑定流程

  1. SP 构造 AuthnRequest,使用 SP 私钥签名(可选)。
  2. 对请求进行 Base64 编码,并附加 SAMLRequest 参数到 URL。
  3. 浏览器通过 HTTP 302 重定向将请求发送到 IdP。
  4. IdP 解码并验证签名(如有),处理认证。

4.3.3 HTTP POST 绑定流程

  1. IdP 构造 Response(含签名断言),进行 Base64 编码。
  2. 将编码后的消息放入 HTML 表单的 SAMLResponse 隐藏字段。
  3. 浏览器自动提交表单到 SP 的 Assertion Consumer Service (ACS) URL。
  4. SP 接收并解码,验证断言签名。

4.3.4 Artifact 绑定流程

  1. IdP 生成一个短小的 artifact 标识(引用完整的 SAML 消息)。
  2. 通过 URL 参数将 artifact 发送到 SP。
  3. SP 通过后端 SOAP 通道(ArtifactResolve/ArtifactResponse)向 IdP 请求完整消息。
  4. IdP 返回完整的 SAML 响应,SP 进行签名校验。
安全注意: HTTP Redirect 绑定中,签名参数(SigAlg 和 Signature)也附加在 URL 上。攻击者可能利用 URL 重放或篡改,因此必须验证签名且使用 HTTPS 传输。Artifact 绑定虽然减少浏览器暴露,但后端通道仍需 TLS 保护。

4.4 SAML 绑定方式架构图

下图展示了三种绑定方式在浏览器 SSO 流程中的消息传递路径:

SAML 绑定方式架构图 浏览器 (User Agent) 服务提供商 (SP) 身份提供商 (IdP) SP 侧 IdP 侧 Redirect AuthnRequest (URL) POST Response (表单) Artifact (前端) artifact 标识 Artifact (后端) SOAP 通道 绑定方式选择建议 Redirect 适合 SP 发起的轻量请求;POST 适合 IdP 返回含断言的响应;Artifact 适合对消息保密性要求高的场景

4.5 签名校验与绑定方式的关系

不同的绑定方式对签名校验策略有直接影响:

  • Redirect 绑定: 签名参数(Signature、SigAlg)附加在 URL 上,SP 需验证 AuthnRequest 的签名。IdP 返回的 Response 通常通过 POST 绑定传递,断言签名在消息体内。
  • POST 绑定: 签名位于 Response 或 Assertion 内部,使用 XML 数字签名标准。校验时需注意规范化算法(Canonicalization)和摘要算法的一致性。
  • Artifact 绑定: 前端仅传递 artifact,后端 SOAP 通道返回完整消息。签名校验在 SP 后端完成,需确保 artifact 解析后的消息未被篡改。
校验流程要点: 无论使用哪种绑定方式,SP 都必须验证断言中的 ds:Signature,包括:① 确认签名算法(如 RSA-SHA256);② 验证摘要值是否与断言内容匹配;③ 使用 IdP 公钥验证签名值;④ 检查断言有效期(Conditions)和受众(AudienceRestriction)。

4.6 本章小结