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

     2023-03-10     72

关键词:

【中文标题】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) 非常清楚地解释了问题的原因。

.Net核心根据登录用户的角色从数据库查询数据

...:2021-04-1121:45:54【问题描述】:NET3.1核心项目。我已经在azureAD中注册了应用程序,并且我已经进行了配置以接收JWT令牌中的角色。我有像全局管理员、区域管理员和用户这样的角色。目前在.Net核心中,我有APIS,A 查看详情

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

】ASP.netCore2.0AzureAdBearerJWT-TokenAuth在验证签名时不会失败【英文标题】:ASP.netCore2.0AzureAdBearerJWT-TokenAuthnotfailonvalidatesignature【发布时间】:2018-07-0707:48:04【问题描述】:我有两个应用程序一个Web应用程序(Web-UI)和一个Webapi。首先,... 查看详情

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

】如何在python中验证来自AzureAD的JWT?【英文标题】:HowtovalidateaJWTfromAzureADinpython?【发布时间】:2020-11-2111:48:41【问题描述】:我已经使用AzureAD设置了授权服务器。为了测试它,我目前正在应用一个隐式流并获取一个令牌和id_tok... 查看详情

在 ASP.NET 核心中创建 JWT 是不是有更简单的方法?又名“JWT 身份验证的最佳实践?”

】在ASP.NET核心中创建JWT是不是有更简单的方法?又名“JWT身份验证的最佳实践?”【英文标题】:IsthereasimplerwayforcreatingJWTsinASP.NETcore?aka“BestPracticesforJWTAuthentication?”在ASP.NET核心中创建JWT是否有更简单的方法?又名“JWT身份验... 查看详情

验证由 .net 核心微服务创建的 JWT

】验证由.net核心微服务创建的JWT【英文标题】:ValidateJWTcreatedbya.netcoremicroservice【发布时间】:2021-03-2415:11:00【问题描述】:我在docker中运行了一些.net核心WebAPI微服务。例如:目录API、邮政编码API、结帐API。我创建了另一个验... 查看详情

在 .net 核心 web api 中存储 JWT 令牌的位置?

】在.net核心webapi中存储JWT令牌的位置?【英文标题】:WheretostoreJWTTokenin.netcorewebapi?【发布时间】:2019-04-2614:41:37【问题描述】:我正在使用webapi来访问数据,并且我想对webapi进行身份验证和授权。为此,我正在使用JWT令牌身份... 查看详情

在 c# 中为使用 AzureAd 登录的当前用户获取 Jwt 令牌

】在c#中为使用AzureAd登录的当前用户获取Jwt令牌【英文标题】:GettingJwtTokenforcurrentuserloggedinwithAzureAdInc#【发布时间】:2021-11-1105:17:48【问题描述】:我使用AzureAd进行身份验证。登录工作正常,没有问题。现在我正在尝试为登录... 查看详情

如何使用 .net 核心将带有声明的 JWT 存储在 cookie 中

】如何使用.net核心将带有声明的JWT存储在cookie中【英文标题】:HowtostoreaJWTwithclaimsinacookieusing.netcore【发布时间】:2018-01-1821:31:48【问题描述】:我在处理控制器中用于检查用户权限的声明时遇到了很多麻烦。应用结构我们的后... 查看详情

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

】asp.net核心应用程序中的AzureAD和AzureADBearer,给出无效签名错误【英文标题】:AzureADandAzureADBearerinasp.netcoreapp,givesinvalidsignatureerror【发布时间】:2019-10-2106:22:17【问题描述】:我在asp.netcore2应用程序中使用AzureAD。我想同时使用co... 查看详情

asp.net 核心中的 jwt 令牌无效

】asp.net核心中的jwt令牌无效【英文标题】:InvalidjwtTokeninasp.netcore【发布时间】:2020-11-1919:09:06【问题描述】:我正在尝试在我的Angular应用程序和ASP.net核心中使用JWT。对于初学者,我使用“邮递员”来测试我的端点。在我的API... 查看详情

如何使 AzureAD 和自定义 JWT 令牌在 Web API 中并行工作?

】如何使AzureAD和自定义JWT令牌在WebAPI中并行工作?【英文标题】:HowtomakeAzureADandcustomJWTtokenstoworksidebysideinwebAPI?【发布时间】:2019-06-2423:05:38【问题描述】:API客户端使用API本身(标准)或AzureAD颁发的JWT令牌。当我只启用自定... 查看详情

如何让 JWT 在 Autorest 生成的 SDK 中工作? (ASP.NET 核心 2.0)

】如何让JWT在Autorest生成的SDK中工作?(ASP.NET核心2.0)【英文标题】:HowdoIgetJWTworkinginAutorestgeneratedSDK?(ASP.NETCore2.0)【发布时间】:2018-10-2913:10:02【问题描述】:我希望能够使用用户名和密码登录我的身份数据库并检索JWT。然后... 查看详情

ASP.NET 核心 JWT 令牌验证在同一来源上失败

】ASP.NET核心JWT令牌验证在同一来源上失败【英文标题】:ASP.NETcoreJWTTokenValidationfailsonsameorigin【发布时间】:2020-02-1610:16:34【问题描述】:我正在使用AngularWeb客户端编写一个ASP.NET核心(2.2)应用程序。对于身份验证,我使用JWT令牌... 查看详情

单次使用 Jwt Token 在 angular 6 的 asp.net 核心中进行电子邮件验证

】单次使用JwtToken在angular6的asp.net核心中进行电子邮件验证【英文标题】:SingletimeuseJwtTokenforemailverificationinasp.netcorewithangular6【发布时间】:2019-03-1507:12:41【问题描述】:我,正在使用jwt令牌进行一次电子邮件验证。这是生成jwt... 查看详情

通过 ASP.NET 核心身份中的角色声明进行 JWT 身份验证

】通过ASP.NET核心身份中的角色声明进行JWT身份验证【英文标题】:JWTAuthenticationbyroleclaimsinASP.NETcoreIdentity【发布时间】:2018-08-3118:43:11【问题描述】:如何通过包含在用户角色中的声明对用户进行身份验证?在Startup.cs:services.AddA... 查看详情

JWT Token 中的 Aud 字段表示啥?

...题描述】:您好,我有SPA应用程序和.Net核心WebAPI。我在azureAD中注册了两个应用程序。下面是我在react应用中的adal配置。/*istanbulignorefile*/importadalGetToken,A 查看详情

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

】AzureADJWT令牌受众声明前缀使JWT令牌无效【英文标题】:AzureADJWTTokenAudienceclaimprefixmakesJWTTokeninvalid【发布时间】:2016-12-2300:42:08【问题描述】:我正在使用“adal-node”npm包向AzureAD进行身份验证。这一切都很好,我得到了一个令... 查看详情

uri查询参数中的asp.net核心JWT?

】uri查询参数中的asp.net核心JWT?【英文标题】:asp.netcoreJWTinuriqueryparameter?【发布时间】:2018-01-2712:34:28【问题描述】:我有一个受JWT和Authorize属性保护的api,在客户端我使用jqueryajax调用来处理它。这很好用,但是我现在需要能... 查看详情