【问题标题】:How to add a policy for role in ASP.NET Core for JWT?如何在 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 中的数组项?

【问题讨论】:

    标签: c# asp.net-core jwt


    【解决方案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 声明中指定的,其值为数组。
    猜你喜欢
    • 1970-01-01
    • 2017-10-15
    • 2021-12-18
    • 1970-01-01
    • 2022-11-23
    • 2022-10-04
    • 2016-08-16
    • 1970-01-01
    • 2020-08-08
    相关资源
    最近更新 更多