如何在 ASP.NET Core for JWT 中添加角色策略?

Posted

技术标签:

【中文标题】如何在 ASP.NET Core for JWT 中添加角色策略?【英文标题】:How to add a policy for role in ASP.NET Core for JWT? 【发布时间】:2021-10-13 22:27:04 【问题描述】:

我知道我可以通过这种方式为我的 JWT 自定义声明添加政策:

services.AddAuthorization(options =>
    
        options.AddPolicy("HasRole", policy => policy.RequireClaim("role", "Teacher"));
    );

但是,我的 JWT 令牌具有一系列角色:

// parsed jwt token

   ...,
   roles: ['Teacher', 'Parent', 'Admin']
   ...

而且我不知道如何重写上面的代码:

services.AddAuthorization(options =>
    
        options.AddPolicy("IsTeacher", 
                 policy => policy.RequireClaim("roles", /*what should I write here*/));
    );

我如何要求RequireClaim 中的数组项?

【问题讨论】:

【参考方案1】:

您可以使用 RequireRole() 根据您的角色设置策略:

services.AddAuthorization(o =>

    // Teacher or admin can access.
    o.AddPolicy("RequireTeacherRole", p => p.RequireRole("teacher", "admin"));
    // Only admin can access.
    o.AddPolicy("RequireAdminRole", p => p.RequireRole("admin"));
);

现在您可以保护您的 MVC/API 控制器或剃须刀页面

[Authorize(Policy = "RequireTeacherRole")]
public class MyController : Controller

    // ...

【讨论】:

RequireRole 从哪里读取数据?这些声明是自定义声明。如果我的索赔名称是 kdkksk 怎么办? .NET Core 如何从自定义 claism 中提取角色? 我认为 RequireClaim 遵循相同的规则:p => p.RequireClaim("kdkksk", "teacher", "admin") ASP.NET 通过检查此声明中的任何受支持值是否与任何指定值匹配来处理此问题:context.User.Claims.Any(c => string.Equals(c.Type, requirement.ClaimType, StringComparison.OrdinalIgnoreCase) && requirement.AllowedValues.Contains(c.Value, StringComparer.Ordinal));(请参阅source.dot.net/#Microsoft.AspNetCore.Authorization/… ) 当您将多个值传递给RequireClaim 时。例如RequireClaim("role", "admin", "teacher")。但我的情况不同。我只想包括一个角色。 RequireClaim("role", "Teacher")。但是,该角色是在自定义 jwt 声明中指定的,其值为数组。

以上是关于如何在 ASP.NET Core for JWT 中添加角色策略?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 ASP.NET Core 中转储解析的 JWT 令牌?

如何在 asp.net core 中设置 jwt 令牌的生命周期

如何使用剃刀视图 ASP .Net Core 从 JWT 声明角色

如何在 asp.net core 2.0 中允许具有不同发行者的多个 JWT

如何使用 ASP.NET Core 中的声明检查 JWT 中的权限?

如何使用 ASP.NET Core 从 DbContext 中的 JWT 获取用户名?