【问题标题】:Claims not being passed to a Relying Party in ADFS 2.0在 ADFS 2.0 中未将声明传递给依赖方
【发布时间】:2011-10-15 20:01:04
【问题描述】:

好的,所以我对声明感知应用程序的整个世界都很陌生。我能够使用 Azure ACS 快速启动并运行,但在尝试使用 ADFS 2.0 作为身份提供者时情况有所不同(我实际上想将其用作联合提供者,但目前我'我只是试图让一个样本运行使用它作为身份提供者)。

我一直在查看the guides here 并尝试按照AD FS 2.0 Federation 以及其中列出的 WIF 应用程序分步指南指南进行操作。它会带您完成 ADFS 2.0 的设置以及一个小声明感知示例应用程序,您可以使用它来查看正在发送的声明。

所以我可以启动并运行它,通过指南中定义的声明(只是 Windows 帐户名称)。问题是当我尝试添加更多内容时。我可以转到 ADFS GUI 中的依赖方应用程序并使用 Pass Through 或 Filter Incoming Claim 规则模板添加一个颁发转换规则。但是,当我运行我的应用程序时,除非添加的声明类型是 Name,否则它不会将声明传递给我的应用程序。

我想要传递的其中一个是登录到应用程序的用户的电子邮件地址。所以我添加了一个规则来传递电子邮件地址,然后更新了示例应用程序的 web.config 以取消注释 claimTypeRequired 部分下的这一行:

<claimType type="http://schemas.xmlsoap.org/ws/2005/05/identity/claims/emailaddress" optional="false" />

请注意,我将其设置为非可选。我还更新了应用程序的联合元数据以添加以下内容:

<auth:ClaimType Uri="http://schemas.xmlsoap.org/ws/2005/05/identity/claims/emailaddress" Optional="false" xmlns:auth="http://docs.oasis-open.org/wsfed/authorization/200706" />

然后我进入 ADFS GUI,进入 Relying Party Trusts 并在我的示例应用程序中选择 Update from Federation Metadata。因此,它现在将电子邮件列为已接受的声明之一。

然后,我进入 Claims Provider Trusts 并将电子邮件声明规则添加到 Active Directory 提供程序信任的接受转换规则中(仅列出一个)。

但是,当我运行该应用程序时,它并没有通过电子邮件声明(或我尝试的任何其他方法)。有人可以告诉我我在这里缺少什么吗?

我还应该注意,我运行了一个测试,将我的应用程序更改为仅接受电子邮件声明规则,它不仅没有通过电子邮件,而且仍然通过 Windows 帐户名称 和 名称 声明,尽管我什至没有将它们列为我的应用程序接受的声明。

如果有人能指出我在这里严重错误的地方,将不胜感激。

根据之前的博客文章启用日志记录后,以下是日志中的相关条目: 事件 ID 1000,“详细信息中包含调用主体的输入声明”:

所以你可以看到,我要求的信息很明显丢失了。我将日志输出设置为详细,但实际上没有任何其他兴趣。您将看到 NETWORK SERVICE 用户的跟踪记录(具有相同的声明集),但没有什么引人注目的。所有日志条目都是信息性的,没有任何错误。

【问题讨论】:

  • AD FS 2.0(它本身基于 WIF)有几个日志和跟踪选项;有关详细信息,请参阅blog post "Diagnostics in AD FS 2.0"。
  • 谢谢 Marnix,我现在已经打开了详细日志记录,我将编辑我的问题以提供日志记录输出。
  • 你解决过这个问题吗?我遇到了一个类似的问题,我的 LDAP 声明根本没有出现。

标签: adfs2.0 wif


【解决方案1】:

如果您使用 ADFS 作为身份提供者并希望它发出电子邮件声明,那么您必须使用 Send LDAP Attributes as Claims 或 Custom Claim Rule 访问AD 作为属性存储并发出电子邮件声明。假设用户已经在某处进行了身份验证,则对传入的声明使用传递。在 Windows 身份验证的情况下,Windows 帐户名 是从 Kerberos 令牌发出的,这就是为什么您必须通过它,但其他人则必须发出。

【讨论】:

    【解决方案2】:

    Active Directory 是否发出电子邮件地址声明?我不知道如何检查这个,但如果没有,那么你通过它们是无关紧要的。在这种情况下,您需要尝试“将 LDAP 属性作为声明发送”规则;根据我在 ADFS 实例中看到的内容,尝试将“电子邮件地址”属性映射到“电子邮件地址”声明。

    在与您类似的情况下,我必须做类似的事情才能让 UPN 声明通过。我不确定 LDAP 属性可能是复数是否重要。

    【讨论】:

    • 当您在工作室中运行 FedUtil 以添加 STS 引用时,当您将其指向 STS(在本例中为 ADFS 2.0)时,它会将 STS 发出的声明列表写入您的 web.config ,而电子邮件地址绝对是其中之一。所以我不太确定你说它“无关紧要”是什么意思......
    • 我在工作时尝试了这个,当您使用该 LDAP 规则时,它确实通过了电子邮件地址,但我仍然不明白为什么。另外,仍然不明白为什么它让我通过我不感兴趣的声明。
    • 澄清一下,我不确定为什么当您使用“传递或过滤传入声明”时电子邮件地址无法通过。我在日志中注意到请求似乎来自 E-GAEL2\chriso 用户之前的 NETWORK SERVICE 用户。该请求中的声明是否被视为“传入”集?
    • 我的理解是 Active Directory 不会发出电子邮件地址声明。添加规则以将 LDAP 属性作为声明传递需要 Active Directory 确实具有的内容(和 LDAP 属性),并且 ADFS 将其转换为您想要的内容(电子邮件地址声明)。
    • 至于为什么仍然会发送“名称”和“Windows 帐户名称”,我不知道,除非您在 ADFS 中的依赖方信息中有发行转换规则,这些规则会产生或通过此类声明.
    猜你喜欢
    • 1970-01-01
    • 2015-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多