JWT不授权角色,即使用户拥有角色

时间:2020-09-10 23:20:52

标签: c# authentication .net-core

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

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

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

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

我可以看到我的JWT拥有角色扮演的索赔,我认为这是指角色。

enter image description here

我想知道是否将自己的角色手动添加到JWT中,也许它可以工作?

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

授权过滤器如何在后台运行? w ^ 如何使用我需要从JWT编写自定义映射的角色来授权角色?

1 个答案:

答案 0 :(得分:1)

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

在配置JWT承载选项时,可以通过提供TokenValidationParametersRoleClaimType属性在RoleClaimTypeRetriever中指定自定义角色类型。

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

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