0

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

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

在此处输入图像描述

这是生成的访问令牌:

在此处输入图像描述

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

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;
}

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

谢谢

4

1 回答 1

1

我只使用了 Azure AD 而不是 ADFS 的 Microsoft 代表流程,但看起来您需要在用户信息请求中发送更详细的范围。

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

故障排除

看起来其中之一将是原因:

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

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

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

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

祝你好运 ...

于 2021-03-23T17:18:28.240 回答