需要帮助理解 saml 元数据
Need help understanding saml metatdata
我正在与第 3 方集成,对于声明配置,他们建议我们创建 sAM-Account-Name 到名称 ID,并在 SAML 响应中不断收到此错误:
<samlp:Status>
<samlp:StatusCode Value="urn:oasis:names:tc:SAML:2.0:status:Requester">
<samlp:StatusCode Value="urn:oasis:names:tc:SAML:2.0:status:InvalidNameIDPolicy" />
</samlp:StatusCode>
</samlp:Status>
所以我假设我没有发送格式正确的 NameID。在 SP 的元数据中,他们列出了这个:
<NameIDFormat>
urn:oasis:names:tc:SAML:2.0:nameid-format:transient
</NameIDFormat>
没错,我假设我应该使用瞬态 NameID 格式。然而,这也不起作用,供应商坚称他们希望我们的 SAML 响应使用 urn:oasis:names:tc:SAML:1.1:nameid-format:unspecified 作为名称 ID 格式。据我了解,这是 ADFS 的默认设置。
作为测试,我按照此处的步骤进行操作:https://blogs.msdn.microsoft.com/card/2010/02/17/name-identifiers-in-saml-assertions/ 并且能够获得一个伪造的 NameID(瞬态)以传递到供应商的站点,然后在浏览器中显示用户名是无效,所以至少我得到了一些让我相信我走在正确轨道上的东西,他们的身份验证服务器期待短暂,而他们的应用程序不是。
我会尝试此处的步骤,但我不想影响我的整个索赔提供商:https://social.technet.microsoft.com/wiki/contents/articles/4038.ad-fs-2-0-how-to-request-a-specific-name-id-format-from-a-claims-provider-cp-during-saml-2-0-single-sign-on-sso.aspx
我们的 ADFS 服务器是 运行 Server 2012 R2。这不是我们配置的第一个中继方信任,我们的设置与其他供应商合作良好。然而,我对管理 ADFS 还比较陌生,所以我可能错过了一些简单的东西。
如有任何想法或指导,我们将不胜感激。
如果您的依赖方在 ADFS 中的声明映射包括 Active Directory samAccountName 到 SAML NameID,则服务提供商的元数据指定的 "urn:oasis:names:tc:SAML:2.0:nameid-format:transient" 没有多大意义,因为这个值不是短暂的。
根据 SAML v2.0 规范,SAML 身份验证请求中的可选 NameIDPolicy "specifies constraints on the name identifier to be used to represent the requested subject"。
实际上,不包含 NameIDPolicy 使其默认为 "urn:oasis:names:tc:SAML:2.0:ac:classes:unspecified" 或显式使用此值更简单。
鉴于上述情况,可以安全地忽略服务提供商元数据中的 NameIDFormat,并且 NameIDPolicy 不包含在身份验证请求中。
SP 可以根据其格式拒绝声明,这是最终的问题。解决方案是 SP 要么改变他们的要求,要么必须以要求的格式发送声明。
在这种情况下,SP 要求声明是短暂的,即使他们口头上要求未指定(默认)。与系统打交道时,口头索赔要求不算数!
要使用此 SP 配置 ADFS,只需:
- 使用规则模板创建转换规则:将 LDAP 属性作为声明发送
- LDAP 属性是 SAM-Account-Name
- 传出声明类型是您想要的任何类型(自定义文本,而不是来自下拉列表)
- 使用规则模板创建另一个转换规则:转换传入声明
- 传入的声明类型是您以前的传出声明类型。
- 传出声明类型是名称 ID,格式为瞬态标识符。
这将允许 sAM-Account-Name 以瞬态格式发送到 SP,即使我们知道该属性根据定义是非瞬态的。
查看截图:
我正在与第 3 方集成,对于声明配置,他们建议我们创建 sAM-Account-Name 到名称 ID,并在 SAML 响应中不断收到此错误:
<samlp:Status>
<samlp:StatusCode Value="urn:oasis:names:tc:SAML:2.0:status:Requester">
<samlp:StatusCode Value="urn:oasis:names:tc:SAML:2.0:status:InvalidNameIDPolicy" />
</samlp:StatusCode>
</samlp:Status>
所以我假设我没有发送格式正确的 NameID。在 SP 的元数据中,他们列出了这个:
<NameIDFormat>
urn:oasis:names:tc:SAML:2.0:nameid-format:transient
</NameIDFormat>
没错,我假设我应该使用瞬态 NameID 格式。然而,这也不起作用,供应商坚称他们希望我们的 SAML 响应使用 urn:oasis:names:tc:SAML:1.1:nameid-format:unspecified 作为名称 ID 格式。据我了解,这是 ADFS 的默认设置。
作为测试,我按照此处的步骤进行操作:https://blogs.msdn.microsoft.com/card/2010/02/17/name-identifiers-in-saml-assertions/ 并且能够获得一个伪造的 NameID(瞬态)以传递到供应商的站点,然后在浏览器中显示用户名是无效,所以至少我得到了一些让我相信我走在正确轨道上的东西,他们的身份验证服务器期待短暂,而他们的应用程序不是。
我会尝试此处的步骤,但我不想影响我的整个索赔提供商:https://social.technet.microsoft.com/wiki/contents/articles/4038.ad-fs-2-0-how-to-request-a-specific-name-id-format-from-a-claims-provider-cp-during-saml-2-0-single-sign-on-sso.aspx
我们的 ADFS 服务器是 运行 Server 2012 R2。这不是我们配置的第一个中继方信任,我们的设置与其他供应商合作良好。然而,我对管理 ADFS 还比较陌生,所以我可能错过了一些简单的东西。
如有任何想法或指导,我们将不胜感激。
如果您的依赖方在 ADFS 中的声明映射包括 Active Directory samAccountName 到 SAML NameID,则服务提供商的元数据指定的 "urn:oasis:names:tc:SAML:2.0:nameid-format:transient" 没有多大意义,因为这个值不是短暂的。
根据 SAML v2.0 规范,SAML 身份验证请求中的可选 NameIDPolicy "specifies constraints on the name identifier to be used to represent the requested subject"。
实际上,不包含 NameIDPolicy 使其默认为 "urn:oasis:names:tc:SAML:2.0:ac:classes:unspecified" 或显式使用此值更简单。
鉴于上述情况,可以安全地忽略服务提供商元数据中的 NameIDFormat,并且 NameIDPolicy 不包含在身份验证请求中。
SP 可以根据其格式拒绝声明,这是最终的问题。解决方案是 SP 要么改变他们的要求,要么必须以要求的格式发送声明。
在这种情况下,SP 要求声明是短暂的,即使他们口头上要求未指定(默认)。与系统打交道时,口头索赔要求不算数!
要使用此 SP 配置 ADFS,只需:
- 使用规则模板创建转换规则:将 LDAP 属性作为声明发送
- LDAP 属性是 SAM-Account-Name
- 传出声明类型是您想要的任何类型(自定义文本,而不是来自下拉列表)
- 使用规则模板创建另一个转换规则:转换传入声明
- 传入的声明类型是您以前的传出声明类型。
- 传出声明类型是名称 ID,格式为瞬态标识符。
这将允许 sAM-Account-Name 以瞬态格式发送到 SP,即使我们知道该属性根据定义是非瞬态的。
查看截图: