适用对象:需要接入本统一身份认证平台的第三方应用系统(SP)
协议版本:SAML 2.0
文档版本:v2.0
更新日期:2026-02-02
| 角色 | 名称 | 职责 |
|---|---|---|
| IdP | 统一身份认证平台 | 认证用户身份,生成 SAML 断言 |
| SP | 第三方应用系统 | 接收断言,授权用户访问资源 |
用户 → SP → [SAML Request] → IdP 认证 → 用户登录 → [SAML Response] → SP 创建会话GET {IdP_HOST}/sso/saml2/metadatametadata.xml 文件POST {IdP_HOST}/sso/saml2/sso| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| SAMLRequest | String | 是 | Base64 编码的 SAML AuthnRequest(由 SP 自动生成) |
| RelayState | String | 否 | 会话状态参数(由 SP 维护,IdP 需原样返回) |
<saml2p:AuthnRequest
xmlns:saml2p="urn:oasis:names:tc:SAML:2.0:protocol"
AssertionConsumerServiceURL="https://sp.example.com/saml/acs"
Destination="https://idp.example.com/sso/saml2/sso"
ID="_request_id"
IssueInstant="2026-02-02T02:53:23.352Z"
Version="2.0">
<saml2:Issuer xmlns:saml2="urn:oasis:names:tc:SAML:2.0:assertion">
https://sp.example.com/
</saml2:Issuer>
<saml2p:NameIDPolicy
AllowCreate="true"
Format="urn:oasis:names:tc:SAML:2.0:nameid-format:transient"/>
</saml2p:AuthnRequest>AssertionConsumerServiceURL:SP 的 ACS 端点(接收 SAML Response 的 URL)Issuer:SP 的 EntityID(SP 的唯一标识符)NameIDPolicy Format:SP 要求的 NameID 格式(常见:transient、persistent、unspecified)200text/html; charset=UTF-8<saml2p:Response
xmlns:saml2p="urn:oasis:names:tc:SAML:2.0:protocol"
xmlns:saml2="urn:oasis:names:tc:SAML:2.0:assertion"
xmlns:ds="http://www.w3.org/2000/09/xmldsig#"
ID="_response_id"
Version="2.0"
IssueInstant="2026-02-02T02:53:23Z"
InResponseTo="_request_id"
Destination="{SP_ACS_URL}">
<saml2:Issuer>{IdP_EntityID}</saml2:Issuer>
<!-- Response 层签名(必需) -->
<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="#_response_id">
<ds:Transforms>
<ds:Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature"/>
<ds:Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"/>
</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:KeyInfo>
<ds:X509Data>
<ds:X509Certificate>[证书内容]</ds:X509Certificate>
</ds:X509Data>
</ds:KeyInfo>
</ds:Signature>
<saml2p:Status>
<saml2p:StatusCode Value="urn:oasis:names:tc:SAML:2.0:status:Success"/>
</saml2p:Status>
<saml2:Assertion ID="_assertion_id" Version="2.0" IssueInstant="2026-02-02T02:53:23Z">
<saml2:Issuer>{IdP_EntityID}</saml2:Issuer>
<!-- Assertion 层签名(必需) -->
<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="#_assertion_id">
<ds:Transforms>
<ds:Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature"/>
<ds:Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"/>
</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:KeyInfo>
<ds:X509Data>
<ds:X509Certificate>[证书内容]</ds:X509Certificate>
</ds:X509Data>
</ds:KeyInfo>
</ds:Signature>
<saml2:Subject>
<saml2:NameID Format="urn:oasis:names:tc:SAML:2.0:nameid-format:transient">user_id</saml2:NameID>
<saml2:SubjectConfirmation Method="urn:oasis:names:tc:SAML:2.0:cm:bearer">
<saml2:SubjectConfirmationData
InResponseTo="_request_id"
NotOnOrAfter="2026-02-02T02:58:23Z"
Recipient="{SP_ACS_URL}"/>
</saml2:SubjectConfirmation>
</saml2:Subject>
<saml2:Conditions
NotBefore="2026-02-02T02:52:23Z"
NotOnOrAfter="2026-02-02T02:58:23Z">
<saml2:AudienceRestriction>
<saml2:Audience>{SP_EntityID}</saml2:Audience>
</saml2:AudienceRestriction>
</saml2:Conditions>
<saml2:AuthnStatement AuthnInstant="2026-02-02T02:53:23Z" SessionIndex="_session_id">
<saml2:AuthnContext>
<saml2:AuthnContextClassRef>urn:oasis:names:tc:SAML:2.0:ac:classes:PasswordProtectedTransport</saml2:AuthnContextClassRef>
</saml2:AuthnContext>
</saml2:AuthnStatement>
<saml2:AttributeStatement>
<saml2:Attribute Name="uid" NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:basic">
<saml2:AttributeValue xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="xs:string">zhangsan</saml2:AttributeValue>
</saml2:Attribute>
<saml2:Attribute FriendlyName="Name" Name="name" NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:basic">
<saml2:AttributeValue xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="xs:string">张三</saml2:AttributeValue>
</saml2:Attribute>
<saml2:Attribute Name="phone" NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:basic">
<saml2:AttributeValue xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="xs:string">13800138000</saml2:AttributeValue>
</saml2:Attribute>
<saml2:Attribute FriendlyName="Email" Name="email" NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:basic">
<saml2:AttributeValue xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="xs:string">zhangsan@example.com</saml2:AttributeValue>
</saml2:Attribute>
<saml2:Attribute Name="employee_number" NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:basic">
<saml2:AttributeValue xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="xs:string">202101</saml2:AttributeValue>
</saml2:Attribute>
<saml2:Attribute Name="type" NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:basic">
<saml2:AttributeValue xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="xs:string">L01</saml2:AttributeValue>
</saml2:Attribute>
<!-- 其他业务属性根据 SP 需求配置 -->
</saml2:AttributeStatement>
</saml2:Assertion>
</saml2p:Response><saml2p:Response
xmlns:saml2p="urn:oasis:names:tc:SAML:2.0:protocol"
xmlns:saml2="urn:oasis:names:tc:SAML:2.0:assertion"
ID="_error_response_id"
Version="2.0"
IssueInstant="2026-02-02T02:53:23Z"
InResponseTo="_request_id"
Destination="{SP_ACS_URL}">
<saml2:Issuer>{IdP_EntityID}</saml2:Issuer>
<saml2p:Status>
<saml2p:StatusCode Value="urn:oasis:names:tc:SAML:2.0:status:AuthnFailed"/>
<saml2p:StatusMessage>用户认证失败</saml2p:StatusMessage>
</saml2p:Status>
</saml2p:Response>| 属性名 | 说明 | 示例 | NameFormat |
|---|---|---|---|
| uid | 用户唯一标识 | zhangsan | basic |
| name | 用户姓名 | 张三 | basic |
| phone | 手机号 | 13800138000 | basic |
| 邮箱 | zhangsan@example.com | basic | |
| employee_number | 工号/学号 | 202101 | basic |
| type | 用户类型 | L01(教师)/L02(学生) | basic |
| department | 部门/院系 | 计算机学院 | basic |
| ic_number | 身份证号 | 110101199001011234 | basic |
| auth_ip | 认证IP | 192.168.1.100 | basic |
urn:oasis:names:tc:SAML:2.0:attrname-format:basicxsi:type="xs:string"<saml2:AttributeValue/><saml2p:Response> 和 <saml2:Assertion> 签名<saml2p:Response> 签名<saml2:Assertion> 签名| 项目 | 算法标识符 |
|---|---|
| 签名算法 | RSA-SHA256 (http://www.w3.org/2001/04/xmldsig-more#rsa-sha256) |
| 摘要算法 | SHA-256 (http://www.w3.org/2001/04/xmlenc#sha256) |
| 规范化算法 | Exclusive XML Canonicalization (http://www.w3.org/2001/10/xml-exc-c14n#) |
| Transform | Enveloped Signature + Exclusive C14N |
<ds:X509Certificate> 中)| 项目 | 值 | 说明 |
|---|---|---|
| SAML 版本 | 2.0 | 固定值 |
| 协议命名空间 | urn:oasis:names:tc:SAML:2.0:protocol | 固定值 |
| 断言命名空间 | urn:oasis:names:tc:SAML:2.0:assertion | 固定值 |
| 绑定方式 | HTTP-POST | 推荐方式 |
| SubjectConfirmation 方法 | urn:oasis:names:tc:SAML:2.0:cm:bearer | 浏览器 SSO |
| NameID 格式 | transient / persistent / unspecified | 可配置 |
| 属性格式 | urn:oasis:names:tc:SAML:2.0:attrname-format:basic | 默认格式 |
| 断言有效期 | NotBefore(当前时间-1分钟)~ NotOnOrAfter(当前时间+5分钟) | 可配置 |
| SubjectConfirmationData 有效期 | NotOnOrAfter(当前时间+5分钟) | 可配置 |
| 参数名称 | 说明 | 示例 |
|---|---|---|
| SP EntityID | SP 的唯一标识符(通常是 URL) | https://sp.example.com/ |
| ACS URL | 接收 SAML Response 的端点 | https://sp.example.com/saml/acs |
| 服务名称 | 应用系统的中文名称 | 教务系统 |
| 需要的用户属性 | 属性名称列表 | uid, name, email, phone |
| NameID Format | 要求的 NameID 格式 | transient / persistent |
| 参数名称 | 获取方式 |
|---|---|
| IdP EntityID | 从元数据文件中获取 |
| SSO Service URL | 从元数据文件中获取(SingleSignOnService 元素) |
| IdP 元数据文件 | 从 {IdP_HOST}/sso/saml2/metadata 下载 |
| 签名证书 | 嵌入在元数据文件的 KeyDescriptor 中 |
| 错误类型 | 原因 | 解决方案 |
|---|---|---|
| AuthnFailed | 用户认证失败 | 检查用户名密码、账号状态 |
| RequestDenied | 请求被拒绝 | 检查 SAML Request 格式、SP 是否已注册 |
| Responder | IdP 内部错误 | 查看 IdP 日志,联系技术支持 |
| 属性缺失 | SP 要求的属性未返回 | 检查 SP 属性配置,确认用户是否有该属性值 |
{IdP_HOST}/sso/saml2/metadata)