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 在验证签名时不会失败
asp.net 核心应用程序中的 AzureAD 和 AzureADBearer,给出无效签名错误