【问题标题】:AddMicrosoftIdentityWebApp Not Retrieving additional claims from UserInfoEndpointAddMicrosoftIdentityWebApp 未从 UserInfoEndpoint 检索其他声明
【发布时间】:2021-04-19 20:59:38
【问题描述】:

这是迄今为止我的创业公司的 sn-p:

services.AddAuthentication(OpenIdConnectDefaults.AuthenticationScheme)
.AddMicrosoftIdentityWebApp(Configuration.GetSection("AzureAd"))
.EnableTokenAcquisitionToCallDownStreamApi(initialScopes)
.AddMicrosoftGraph(Configuration.GetSection("GraphAPI"))
.AddInMemoryTokenCaches();

使用上面的配置,我应该得到登录屏幕,我看到反向通道 http 请求正在访问 .well-known-config,获取端点,将登录结果发布到我的 redirectUrl。我还看到中间件正在访问令牌端点并获取具有正确范围(包括 User.ReadBasic.All)的 access_token,但它没有使用该令牌来访问 userInfo 端点并检索与用户关联的那些声明。 ReadBasic.All.

我是不是配置错了,还是需要在某个地方手动配置?如果我必须手动配置它似乎很愚蠢,当普通的 OpenIdConnect 中间件有一个选项设置为 true 时,它​​会自动为您获取这些声明。

编辑:我忘了提到,如果我改用 OpenIdConnect 中间件,我可以毫无问题地得到所有这些声明,所以这不是 Azure 配置问题。

请帮忙。

【问题讨论】:

  • but it is NOT using that token to hit the userInfo endpoint and retrieve those claims associated with User.ReadBasic.All. 这是什么意思?它会给你任何错误信息或状态码吗?
  • 没有错误,中间件根本不会使用从令牌端点获得的 access_token 向 userinfo 端点发出 http 请求。即使我手动将“GetClaimsFromUserInfoEndpoint”设置为 true,该调用也不会发生。昨天大部分时间我都在使用 dotPeek 调试中间件,但这是一个巨大的痛苦。
  • “code id_token”流程如下:客户端请求登录并提供所需的客户端凭据,如果用户正确登录,IDP将返回一个authorization_code和一个id_token。 id_token 将有一些基本级别的声明,但不是全部,以避免票证膨胀。如果客户端需要更多声明,它将对令牌端点使用授权码,然后对用户信息端点使用生成的 access_token。中间件有一个选项 GetClaimsFromUserInfoEndpoint 来启用/禁用。适用于 openConnectMiddleware 而不是 MicrosoftIdentity 中间件
  • 那么您的 UserInfo 端点是什么?您能否分享更多详细信息并告诉我们哪条线不起作用?
  • @Rena 这只是标准的graph.microsoft.com{tenantidhere}/oidc/userinfo。它在发现文档中定义,中间件用于命中令牌端点并获取命中 userinfo 端点所需的令牌,但它只是没有命中。我的直觉告诉我,新 IdentityPlatform 中间件中的那个选项没有被正确使用......

标签: asp.net-core azure-active-directory openid-connect microsoft-identity-platform


【解决方案1】:

如果您看到从 UserInfo 端点返回的数据/声明(如果您在 Fiddler 等工具中查看流量)但在 ClaimsPrincipal 用户对象中看不到它们?

如果是这种情况,那么您需要进行一些声明转换并明确映射缺失的声明。因为默认情况下,.NET 不会将收到的所有声明包含到用户对象中。

如果您直接使用 AddOpenIdConnect,那么您将编写如下代码来进行映射:

options.ClaimActions.MapUniqueJsonKey("sub", "sub");
options.ClaimActions.MapUniqueJsonKey("name", "name");
options.ClaimActions.MapUniqueJsonKey("given_name", "given_name");
options.ClaimActions.MapUniqueJsonKey("family_name", "family_name");
options.ClaimActions.MapUniqueJsonKey("profile", "profile");
options.ClaimActions.MapUniqueJsonKey("email", "email");

我不确定当您使用 AddMicrosoftIdentityWebApp 时这到底是如何完成的,但我假设您将能够通过您使用的库找到类似上述内容的内容。

【讨论】:

  • 我实际上是用 options.ClaimActions.MapAll() 映射所有的。这不是在收到声明后映射的问题... UserInfo 端点根本没有被命中。
【解决方案2】:

你有没有尝试添加

JwtSecurityTokenHandler.DefaultMapInboundClaims = false;

Startup.cs?此标志确保 ClaimsIdentity 声明集合将从令牌中的声明构建。这需要在 OpenIdConnectOptions 开始配置之前进行实例化。

【讨论】:

    猜你喜欢
    • 2019-07-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-14
    • 1970-01-01
    • 2015-12-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多