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 绑定流程
- SP 构造
AuthnRequest,使用 SP 私钥签名(可选)。 - 对请求进行 Base64 编码,并附加
SAMLRequest参数到 URL。 - 浏览器通过 HTTP 302 重定向将请求发送到 IdP。
- IdP 解码并验证签名(如有),处理认证。
4.3.3 HTTP POST 绑定流程
- IdP 构造
Response(含签名断言),进行 Base64 编码。 - 将编码后的消息放入 HTML 表单的
SAMLResponse隐藏字段。 - 浏览器自动提交表单到 SP 的 Assertion Consumer Service (ACS) URL。
- SP 接收并解码,验证断言签名。
4.3.4 Artifact 绑定流程
- IdP 生成一个短小的 artifact 标识(引用完整的 SAML 消息)。
- 通过 URL 参数将 artifact 发送到 SP。
- SP 通过后端 SOAP 通道(
ArtifactResolve/ArtifactResponse)向 IdP 请求完整消息。 - IdP 返回完整的 SAML 响应,SP 进行签名校验。
安全注意: HTTP Redirect 绑定中,签名参数(
SigAlg 和 Signature)也附加在 URL 上。攻击者可能利用 URL 重放或篡改,因此必须验证签名且使用 HTTPS 传输。Artifact 绑定虽然减少浏览器暴露,但后端通道仍需 TLS 保护。
4.4 SAML 绑定方式架构图
下图展示了三种绑定方式在浏览器 SSO 流程中的消息传递路径:
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)。