微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

ADFS 2016 代表流:无法获取任何用户信息

如何解决ADFS 2016 代表流:无法获取任何用户信息

我正在尝试在使用 ADFS 2016 作为 STS 的应用程序中实现“代表”流程。作为参考,我查看了这个 Microsoft 教程 (https://docs.microsoft.com/en-ca/windows-server/identity/ad-fs/development/ad-fs-on-behalf-of-authentication-in-windows-server)。它可以正常工作,我可以登录到我的 Web 应用程序,然后在 UserAssertion 中使用我的原始访问令牌来生成一个新的访问令牌,并有适当的受众来调用我的 API 但我发现绝对没有办法包含任何用户信息(子,姓名、电子邮件、upn 等)添加到我的 API 的访问令牌中,即使我在我的 API 的 ADFS 配置中设置了声明规则。

我使用 fiddler 检查了我的应用程序和 adfs 之间的通信,一切看起来都像教程中的信息。请参阅下面的“代表”请求的屏幕截图:

enter image description here

这是生成的访问令牌:

enter image description here

最后,这是我用来生成新访问令牌的代码

private async Task<string> GetAccesstoken(ClaimsPrincipal user,string originalAccesstoken)
{
    var authority = "[authority]";
    var context = new AuthenticationContext(authority,false);
    string userName = user.FindFirstValue("upn");
    var userAssertion = new UserAssertion(originalAccesstoken,"urn:ietf:params:oauth:grant-type:jwt-bearer",userName);
    var cc = new ClientCredential("https://localhost:44387/","[client_secret]");

    var result = await context.AcquiretokenAsync("https://localhost:44339/",cc,userAssertion);

    return result.Accesstoken;
}

您是否遇到过这种情况,如果是,您是否找到了解决此问题的方法

谢谢

解决方法

我只将 Microsoft On Behalf Of 流用于 Azure AD 而不是 ADFS,但您似乎需要在您的用户信息请求中发送更详细的范围。

也许可以尝试发送“openid 个人资料电子邮件”,以表明您需要这种类型的详细信息,如我博客文章的 Section 17 中所示。当然,这是假设所有用户都注册了此类数据。

故障排除

看起来原因之一是:

  • 一个次优的 Microsoft 库,不允许您发送所需的范围
  • 或者 ADFS 2016 可能缺少在 Azure AD 中正常工作的范围功能

我将专注于确保您使用 curl、Postman 或普通 C# HttpClient 等工具发送正确形式的 URL 编码请求消息。这是我用来发送正确范围的代码 - 使用开源库而不是 Microsoft 库:

如果您可以正确发送范围,那么您应该有一个解决方案:

  • 要么获得正确的数据,要么更新代码
  • 或者 ADFS 不支持您想要的行为

祝你好运...

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。