【问题标题】:JWT from AzureAD gives 403 Forbidden in .NET core APIAzureAD 的 JWT 在 .NET 核心 API 中提供 403 Forbidden
【发布时间】: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”声明。但是,我找不到任何文档说明这是否会导致这种情况,或者是否有其他原因。

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

【问题讨论】:

    标签: c# asp.net-core azure-active-directory jwt


    【解决方案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) 非常清楚地解释了问题的原因。
    猜你喜欢
    • 2019-10-25
    • 1970-01-01
    • 2019-04-26
    • 2020-02-16
    • 1970-01-01
    • 2020-07-20
    • 1970-01-01
    • 2020-08-24
    • 2014-10-17
    相关资源
    最近更新 更多