Authn.tech
首页
  • SAML 2.0
  • OAuth 2.0
  • OIDC
  • 工具总览
  • JWT 解析与验签
  • JWT 签名生成
  • JWK / 密钥生成
  • PKCE 生成器
  • OIDC Discovery
  • X.509 证书解析
  • Base64URL
  • SAML 编解码
  • 端点与说明
  • OIDC 登录演示
GitHub
首页
  • SAML 2.0
  • OAuth 2.0
  • OIDC
  • 工具总览
  • JWT 解析与验签
  • JWT 签名生成
  • JWK / 密钥生成
  • PKCE 生成器
  • OIDC Discovery
  • X.509 证书解析
  • Base64URL
  • SAML 编解码
  • 端点与说明
  • OIDC 登录演示
GitHub
  • SAML 2.0

    • SAML 2.0 概述
    • 核心概念
    • 典型流程
    • 典型参数与消息参考

典型参数与消息参考

本页是速查表,按消息类型组织。流程上下文见典型流程,概念解释见核心概念。

AuthnRequest 关键元素与属性

元素/属性必需说明
ID是请求唯一标识(NCName,不能以数字开头,惯例加 _ 前缀)。SP 必须暂存,用于比对 Response 的 InResponseTo
Version是固定 2.0
IssueInstant是签发时间,UTC ISO 8601(如 2026-07-03T08:29:55Z)。IdP 会拒绝偏差过大的请求
Destination推荐IdP SSO 端点 URL。消息经签名时 IdP 必须校验其与实际接收地址一致
AssertionConsumerServiceURL推荐期望接收 Response 的 SP ACS 地址。IdP 必须核对其在 SP Metadata 登记范围内,否则可被用于窃取 Assertion
ProtocolBinding可选期望 Response 使用的 Binding,一般为 urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST
AssertionConsumerServiceIndex可选用索引代替显式 URL(二选一)
ForceAuthn可选true 时要求 IdP 忽略已有会话、强制重新认证(敏感操作前的 step-up 常用)
IsPassive可选true 时禁止 IdP 与用户交互;无会话则返回 NoPassive 错误(用于静默探测登录态)
<Issuer>是SP Entity ID
<NameIDPolicy>可选Format 声明期望的 NameID 格式;AllowCreate="true" 允许 IdP 为新用户建立标识
<RequestedAuthnContext>可选要求的认证强度,内含一或多个 <AuthnContextClassRef>;Comparison 取 exact/minimum/maximum/better
<Scoping> / <ProxyCount>可选代理/中转 IdP 场景,少用

Response 与 Assertion 结构

Response 外层

元素/属性说明
ID / Version / IssueInstant同上,ID 用于日志关联与防重放
InResponseTo对应 AuthnRequest 的 ID。IdP-initiated 流程中不存在
DestinationSP ACS URL,SP 必须校验与自身一致
<Issuer>IdP Entity ID
<samlp:Status>处理结果,见下方 StatusCode 表
<saml:Assertion> 或 <saml:EncryptedAssertion>成功时的断言(0..n 个,Web SSO 下通常恰好 1 个);失败时可无

Status

元素说明
<StatusCode Value="...">顶层状态码(见下表),可嵌套二级 StatusCode 细化原因
<StatusMessage>人类可读信息,排错时先看它
<StatusDetail>机器可读的附加细节

Subject 与 SubjectConfirmation(bearer)

元素/属性说明
<NameID>主体标识,Format 见下文一览表
<SubjectConfirmation Method>Web SSO 固定为 urn:oasis:names:tc:SAML:2.0:cm:bearer("持有即证明")
SubjectConfirmationData/@Recipient必须等于接收该 Assertion 的 ACS URL,SP 必须校验
SubjectConfirmationData/@NotOnOrAfterbearer 确认的过期时刻,必须校验;注意 bearer 场景不含 NotBefore
SubjectConfirmationData/@InResponseTo同 Response 外层语义,SP-initiated 时必须匹配

Conditions

元素/属性说明
NotBefore / NotOnOrAfterAssertion 整体有效窗(前闭后开),校验时留 2–3 分钟时钟容差
<AudienceRestriction>/<Audience>受众,必须包含本 SP 的 Entity ID(不是 ACS URL)
<OneTimeUse>出现时 SP 须保证一次性使用

AuthnStatement

属性/元素说明
AuthnInstant实际认证发生时刻(可能远早于 Assertion 签发,IdP 会话复用时尤甚)
SessionIndexIdP 侧会话索引,SP 应保存,SLO 时回填
SessionNotOnOrAfterIdP 建议的 SP 会话上限,SP 宜遵守
<AuthnContextClassRef>认证方式,常见:...ac:classes:PasswordProtectedTransport(HTTPS 上的密码)、...ac:classes:Password、...ac:classes:TimeSyncToken、urn:oasis:names:tc:SAML:2.0:ac:classes:unspecified。做 MFA 强制时 SP 应校验此值

AttributeStatement

属性/元素说明
<Attribute Name>属性名。可能是短名(mail)也可能是 URI/OID 风格(urn:oid:0.9.2342.19200300.100.1.3、http://schemas.xmlsoap.org/ws/2005/05/identity/claims/emailaddress),对接时以对方实际发送为准
NameFormat...attrname-format:basic / :uri / :unspecified
FriendlyName可读别名,不参与匹配逻辑
<AttributeValue>可多值(如多个组);注意 xsi:type 可能存在

常见 StatusCode

顶层码(Value 前缀均为 urn:oasis:names:tc:SAML:2.0:status:):

值含义
Success成功
Requester请求方(SP)的错——请求非法、参数不被接受
Responder响应方(IdP)的错——IdP 内部原因无法处理
VersionMismatch协议版本不匹配

常见二级码(嵌套在顶层码之内):

值(同前缀)含义
AuthnFailed认证失败(密码错、用户取消等)
InvalidNameIDPolicyIdP 无法满足请求的 NameID Format
NoAuthnContext无法满足 RequestedAuthnContext 的强度要求
NoPassiveIsPassive=true 但用户无会话,需要交互
RequestDenied对端理解请求但拒绝执行(常见于信任配置不符)
UnknownPrincipal无法识别主体
UnsupportedBinding不支持请求指定的 Binding
PartialLogoutSLO 未能通知到所有参与方
ProxyCountExceeded代理跳数超限

NameID Format 一览

Format URI说明
urn:oasis:names:tc:SAML:1.1:nameid-format:unspecified未指定,语义由双方线下约定(兼容性兜底,慎用)
urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress邮箱格式
urn:oasis:names:tc:SAML:1.1:nameid-format:X509SubjectNameX.509 证书主体名
urn:oasis:names:tc:SAML:1.1:nameid-format:WindowsDomainQualifiedNameDOMAIN\user 形式
urn:oasis:names:tc:SAML:2.0:nameid-format:kerberosKerberos principal
urn:oasis:names:tc:SAML:2.0:nameid-format:entity标识 SAML 实体本身(Issuer 元素默认即此)
urn:oasis:names:tc:SAML:2.0:nameid-format:persistent持久化化名:不透明、对单一 SP 稳定、跨 SP 不同,推荐用作账号关联主键
urn:oasis:names:tc:SAML:2.0:nameid-format:transient临时标识,仅本次会话有效

Binding 参数

HTTP-Redirect Binding(URL 查询参数)

参数说明
SAMLRequest / SAMLResponse消息本体:XML → raw deflate → Base64 → URL 编码(编码细节见典型流程)
RelayState不透明状态,≤80 字节,对端必须原样回传
SigAlg签名算法 URI,如 http://www.w3.org/2001/04/xmldsig-more#rsa-sha256
Signature对 SAMLRequest(或 SAMLResponse)=..&RelayState=..&SigAlg=.. 串(URL 编码形态、固定顺序、仅含实际存在的参数)的签名,Base64 后再 URL 编码

HTTP-POST Binding(表单字段)

字段说明
SAMLRequest / SAMLResponseXML → Base64(无 deflate),经浏览器自动提交表单 POST
RelayState同上

POST Binding 下签名是 XML 内嵌的 <ds:Signature>,不走独立字段。

Metadata 关键元素

通用

元素/属性说明
<EntityDescriptor entityID>根元素;entityID 即实体标识
validUntil / cacheDuration元数据有效期/缓存时长,消费方应定期刷新
<KeyDescriptor use="signing">签名验证证书(内嵌 <ds:X509Certificate>);省略 use 表示签名/加密两用
<KeyDescriptor use="encryption">加密公钥证书

IdP 侧(<IDPSSODescriptor>)

元素/属性说明
protocolSupportEnumeration固定含 urn:oasis:names:tc:SAML:2.0:protocol
<SingleSignOnService Binding Location>SSO 端点,按 Binding 各一条
<SingleLogoutService Binding Location>SLO 端点
WantAuthnRequestsSigned是否要求 SP 对 AuthnRequest 签名

SP 侧(<SPSSODescriptor>)

元素/属性说明
<AssertionConsumerService Binding Location index isDefault>ACS 端点,可多条,index 供 AssertionConsumerServiceIndex 引用
<SingleLogoutService>SP 的 SLO 端点
AuthnRequestsSignedSP 承诺对 AuthnRequest 签名
WantAssertionsSignedSP 要求 Assertion 必须签名
<NameIDFormat>SP 支持/期望的 NameID 格式列表

排错速查表

现象常见原因
IdP 报无法解析 SAMLRequestRedirect Binding 编码顺序错(漏 deflate / 带 zlib 头 / URL-safe Base64 / 双重 URL 编码)
Signature validation failed对端证书已轮换而本地 Metadata 未更新;签名/摘要算法不被接受(如 SHA-1 被禁);Redirect 签名串拼接顺序或 URL 编码形态不对;XML 被中间件改写(格式化、转码)
Invalid Destination / RecipientACS 或 SSO 端点 URL 不一致:http vs https、端口、尾部斜杠、反向代理改写了 Host
Audience 校验失败SP Entity ID 配错(常见:把 ACS URL 当 Entity ID 填进 IdP)
Response 过期 / not yet valid双方时钟偏移;SP 未配置 clock skew 容差;用户在 IdP 登录页停留过久后才提交
InResponseTo 不匹配SP 集群未共享请求 ID 存储(A 节点发请求、B 节点收响应);用户回退/刷新导致 ID 已被消费;把 IdP-initiated 响应发到只允许 SP-initiated 的 SP
登录成功但拿不到属性IdP 未配置属性释放(Attribute Release)策略;属性名不匹配(短名 vs URI/OID);Assertion 加密而 SP 未解密就取值
循环重定向(SP↔IdP 反复跳)SP 会话 Cookie 未种上(SameSite/Secure/域配置错),SP 始终认为未登录
IdP 报 unknown/invalid SPAuthnRequest 的 Issuer 与 IdP 侧登记的 Entity ID 不一致
SLO 后其他 SP 仍在线SLO 链路某一跳失败(看是否返回 PartialLogout);SP 未保存 SessionIndex;第三方 Cookie 被浏览器拦截
只有 IE/某代理下失败URL 超长(Redirect Binding 消息过大),改用 POST Binding 发送 AuthnRequest

排错工具

浏览器插件 SAML-tracer(Firefox/Chrome)可直接解码抓到的 SAMLRequest/SAMLResponse;后端排查时先把 Base64 解出来看 XML 原文,再对照本页表格逐项核对,绝大多数问题出在 URL/Entity ID/证书三类配置不一致上。

最近更新: 2026/7/3 08:17
贡献者: linux, Claude Fable 5
Prev
典型流程