【问题标题】:ADFS does not pass NameIDADFS 不传递 NameID
【发布时间】:2025-11-21 21:15:02
【问题描述】:

这是设置身份验证的方式。 - 客户端浏览器将请求(以下 URL)发送到客户端的 ADFS 服务器, - 客户端 ADFS 然后查看嵌套中继状态并将请求转发到我们的 ADFS 服务器。 - 我们的 ADFS 查看请求并将请求发送到我们的 APP。

网址在这里。

https://clientadfs.clientdomain.com/adfs/ls/idpinitiatedsignon.aspx?RelayState=RPID%3Dhttps%3A%2F%2ouradfs.ourdomain.com%2Fadfs%2Fls%2F%26RelayState%3DRPID%3Dhttps%3A%2F%2ourapp.ourdomain.com%2Fvaruna%2Fconsole%2Fsso.aspx%3FsamISso%26lang%3Den_CA

该请求在 ADFS 服务器上生成一个没有错误的空白页面。

我让提琴手跟踪客户端。客户端使用用户的电子邮件地址来识别用户。我可以在发送到客户 ADFS 的 SAML 令牌中看到此电子邮件地址。 这个 SAML 令牌进入我们的 ADFS 服务器,我看到了来自我们的 ADFS 服务器的 SAML 响应。但是,这没有用户电子邮件地址。我认为这就是问题所在。

在我们的 ADFS 服务器上,我有这个客户的声明(在 Claims Provider Trust 上)来处理用户 ID(这是他们的电子邮件):

声明规则名称:电子邮件 传入声明类型:名称 ID 传入姓名 ID 格式:电子邮件 传出姓名 ID 格式:电子邮件 传递所有声明值。

这是声明规则语言中的声明

c:[Type == "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/nameidentifier", Properties["http://schemas.xmlsoap.org/ws/2005/05/identity/claimproperties/format"] == "urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress"]
 => issue(Type = "Email", Issuer = c.Issuer, OriginalIssuer = c.OriginalIssuer, Value = c.Value, ValueType = c.ValueType);

在客户的 ADFS 配置中,这是他们的电子邮件/用户 ID 配置:

IssuanceTransformRules               : @RuleTemplate = "LdapClaims"
                                       @RuleName = "Pass email"
                                       c:[Type == "http://schemas.microsoft.com/ws/2008/06/identity/claims/windowsaccou
                                       ntname", Issuer == "AD AUTHORITY"]
                                        => issue(store = "Active Directory", types = ("http://schemas.xmlsoap.org/ws/20
                                       05/05/identity/claims/nameidentifier"), query = ";mail;{0}", param = c.Value);

我不知道我做错了什么。谁能发现我的问题?或者你能建议我应该在哪里看吗?

感谢您的帮助!

  • RM

【问题讨论】:

    标签: adfs2.0


    【解决方案1】:

    “处理用户 ID(即他们的电子邮件)”

    那么 SAML 断言是针对一种电子邮件还是针对一种用户 ID 的断言?即这个属性的断言名称是什么。

    在 ADFS 方面。转换一个电子邮件声明,它需要一种“http://schemas.xmlsoap.org/ws/2005/05/identity/claims/emailaddress

    更新

    您需要将 NameId 转换为电子邮件。 NameId 还有一个“传入名称 ID 格式”,我猜它是“电子邮件”。您需要在 SAML 元数据中验证这一点。

    因此您的声明规则应如下所示:

    c:[类型 == "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/nameidentifier", 属性["http://schemas.xmlsoap.org/ws/2005/05/identity/claimproperties/format"] == "urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress"] => 问题(类型 = "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/emailaddress", 发行人 = c.Issuer,OriginalIssuer = c.OriginalIssuer,价值 = c.Value, ValueType = c.ValueType);

    更新 1

    ADFS 支持:

    <NameIDFormat>urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress</NameIDFormat>
    <NameIDFormat>urn:oasis:names:tc:SAML:2.0:nameid-format:persistent</NameIDFormat>
    <NameIDFormat>urn:oasis:names:tc:SAML:2.0:nameid-format:transient</NameIDFormat>
    

    所以格式可以是 emailAddress、持久性或瞬态。

    尝试使用所有三种格式的转换规则并查看。

    另外,您的应用程序收到了哪些声明?您可以通过How to: Access Claims in an ASP.NET Page 转储它们。

    【讨论】:

    • 客户端发送了他们的 ADFS 配置。这是他们的电子邮件声明配置。我编辑了上面的原始帖子
    • 好的。谢谢。我以为我就是这样做的。将名称 ID 转换为电子邮件。使用了“转换传入声明规则”。传入声明类型:名称 ID 传入名称 ID 格式:电子邮件 传出名称 ID 格式:电子邮件 传递所有声明值。
    • 但我看到你的答案中有不同的“类型”。我无法使用“转换即将到来的声明规则。我应该使用自定义规则吗?
    • 您能粘贴您的实际索赔规则吗?不确定哪个“类型”不同。您还知道 SAML 元数据中的 NameID 格式吗?
    • 声明此客户的 ADFS 已添加到原始帖子中 - 使用声明语言。我尝试使用自定义规则将其更改为您的。它不起作用。它再次产生了空白页