AzureAD 的 JWT 在 .NET 核心 API 中提供 403 Forbidden

Posted

技术标签:

【中文标题】AzureAD 的 JWT 在 .NET 核心 API 中提供 403 Forbidden【英文标题】:JWT from AzureAD gives 403 Forbidden in .NET core API 【发布时间】:2022-01-06 07:27:00 【问题描述】:

我有一个使用 JWT 身份验证的 asp.net 核心 API。角色用于授权,我不使用范围。 Auth0.com 和 ADFS 都可以正常工作,但是我在使用 AzureAD 时遇到了麻烦。我从 AzureAD 获得了一个 JWT,看起来不错。然而,这会发生:

info: Microsoft.AspNetCore.Authentication.JwtBearer.JwtBearerHandler[2]
      Successfully validated the token.
dbug: Microsoft.AspNetCore.Authentication.JwtBearer.JwtBearerHandler[8]
      AuthenticationScheme: Bearer was successfully authenticated.
info: Microsoft.AspNetCore.Authorization.DefaultAuthorizationService[2]
      Authorization failed.
info: Microsoft.AspNetCore.Authentication.JwtBearer.JwtBearerHandler[13]
      AuthenticationScheme: Bearer was forbidden.

我不知道这是什么原因。另外,由于为什么授权失败,我很难获得更多详细信息。

我看到的来自 Auth0.com 和 AAD 的 JWT 之间的唯一区别是缺少“azp”声明和“范围”声明。 AAD 的令牌具有“scp”声明。但是,我找不到任何文档说明这是否会导致这种情况,或者是否有其他原因。

欢迎任何想法,以及如何获得更多细节!谢谢。

【问题讨论】:

【参考方案1】:

与此同时,我能够解决这个问题。为了将来参考,我在这里发布解决方案。

来自 AAD 的访问令牌中有一个“角色”声明,但由于我不清楚的原因,使用 AAD 作为身份提供者,我必须检查“http://schemas.microsoft.com/ ws/2008/06/identity/claims/role”作为角色声明。

此代码适用于 Auth0、ADFS 和 AAD:

var roleClaim = Configuration["JwtOptions:RoleClaim"];
if (string.IsNullOrWhiteSpace(roleClaim)) roleClaim = "http://schemas.microsoft.com/ws/2008/06/identity/claims/role";
services.AddAuthorization(options =>

    options.AddPolicy("role1", policy => policy.RequireClaim(roleClaim, "role1", "role2"));
    options.AddPolicy("role2", policy => policy.RequireClaim(roleClaim, "role2"));
);

如果有人能解释为什么会这样,我会很感兴趣。目前,我很高兴解决了这个问题。

【讨论】:

旁注:与其对角色声明进行硬编码,不如这样做:if (string.IsNullOrWhiteSpace(roleClaim)) roleClaim = ClaimTypes.Role; 最后一点:[this page] (mderriey.com/2019/06/23/where-are-my-jwt-claims) 非常清楚地解释了问题的原因。

以上是关于AzureAD 的 JWT 在 .NET 核心 API 中提供 403 Forbidden的主要内容,如果未能解决你的问题,请参考以下文章

ASP.net Core 2.0 AzureAd Bearer JWT-Token Auth 在验证签名时不会失败

.net 核心 API 中的混合身份验证

asp.net 核心应用程序中的 AzureAD 和 AzureADBearer,给出无效签名错误

JWT Token 中的 Aud 字段表示啥?

AzureAD JWT 令牌受众声明前缀使 JWT 令牌无效

如何在 python 中验证来自 AzureAD 的 JWT?