【问题标题】:JWT does not authorize roles, even when user has themJWT 不授权角色,即使用户拥有它们
【发布时间】:2020-12-29 11:48:53
【问题描述】:

我正在尝试限制对控制器的访问。使用角色,我创建了一个具有角色的用户,但是我遇到了未经授权的异常。

[Authorize(Roles = ApiRoles.Consumer)]
[Route("api/[controller]")]
public class StripePaymentsController : Controller
{
    //Omitted for simplicity
}

当我尝试访问控制器上的任何方法时,我得到一个 403,但是,如果我删除 Authorize 属性一切正常。

我的印象是这可以开箱即用。例如,我的用户在数据库中具有角色,当我尝试访问时,我会假设它会使用我的用户管理器来检查用户是否具有正确的角色。

我可以看到我的 JWT 对 rol 有一个声明,我假设这意味着角色。

我想知道如果我手动将我的角色添加到 JWT 可能会起作用吗?

编辑:即使我在角色声明中添加角色,它仍然无法授权。

授权过滤器如何在后台工作? W 如何使用我是否需要从 JWT 编写自定义映射来授权角色?

【问题讨论】:

  • 1) 我必须在中间件中添加一个ClaimsIdentity,才能取消声明和令牌并使用HttpContext.User.AddIdentity 添加它们。这使它们可用,但令牌签名在到达带有[Authorize] 的端点之前不会被验证。 2)我必须实现JwtBearerEventsOnTokenValidated,以便在验证令牌时将用户分配给HttpContext.User。我正在从 WebAPI 升级到 Core,所以有些事情可能会有所不同。到目前为止,您对 JWT/上下文/索赔处理有什么看法?

标签: c# authentication .net-core


【解决方案1】:

您需要检查ClaimsIdentity 对象使用的角色声明类型(通过检查身份上的RoleClaimType 属性)。默认情况下,使用ClaimTypes.Role,这意味着根据http://schemas.microsoft.com/ws/2008/06/identity/claims/role 声明检查角色。如果您的 JWT 中没有此类,Roles 属性将无法立即为您工作。

您可以在配置 JWT 承载选项时在 TokenValidationParameters 中指定自定义角色类型,方法是提供 RoleClaimTypeRoleClaimTypeRetriever 属性。

var validationParameters = new TokenValidationParameters
{
    RoleClaimType = "rol"
};

上述代码将角色声明类型更改为“rol”,因此您的 JWT 中的 rol 声明将开始充当角色声明。

【讨论】:

  • 谢谢,当我今晚回到那个项目时,我会检查一下,你知道如何验证多个声明,我是使用逗号分隔列表还是应该复制角色声明?
  • 检查this每个 Authorize 属性将被翻译成一个 授权要求,取决于你如何应用属性或属性,你可以分别做AND和OR关系。 Roles 需要 JWT 中的多个单一角色声明,但如果您将它们组合在一个数组中,您始终可以将自己的 requirement 添加到策略中。
  • 谢谢这一切似乎结帐
猜你喜欢
  • 2017-06-24
  • 2017-12-14
  • 2021-06-11
  • 1970-01-01
  • 2018-04-17
  • 2018-02-19
  • 2011-09-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多