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

Posted

技术标签:

【中文标题】如何使用 ASP.NET Core 中的声明检查 JWT 中的权限?【英文标题】:How to check privileges in JWT using Claims in ASP.NET Core? 【发布时间】:2018-12-24 21:40:23 【问题描述】:

我有一个关于 Claims、JWT 和 ASP.Net Core 的问题。再次......(问候克里斯)。所以...

我的 JWT 带有 Claim

"Authorization": "CanEditUnit,CanBrowseUnit,CanCreateUnit,CanDeleteUnit,CanSeeUnitDetails,CanBrowseRole,CanEditRole,CanCreateRole,CanDeleteRole,CanSeeRoleDetails,CanBrowseUser,CanSeeUserDetails,CanDeleteUser,CanEditUser,CanRegisterNewUser"

等等

Claim 拥有该用户包含的所有权限(例如:如果用户在数据库中的 CanEditUnit 设置为 True,则 CanEditUnit 保存在 Authorization 声明中,但如果某些内容设置为 False,则它根本不会出现在该声明中。

然后我想检查用户是否在这样的策略中拥有该特权:

options.AddPolicy("CanEditUnit", policy => policy.RequireClaim("Authorization", "CanEditUnit"));

但它可能会检查 Authorization 声明是否等于 CanEditUnit

有没有办法用 Contains 而不是 Equal 来检查策略?如果没有,我该怎么办?

我在文档中找到了this,但我不知道如何使用。

【问题讨论】:

【参考方案1】:

正如您在问题中所建议的那样,RequireAssertion 似乎有能力为您处理此问题。这是一个例子:

policy.RequireAssertion(ctx =>

    var authorizationClaim = ctx.User.FindFirstValue("Authorization");

    if (authorizationClaim == null)
        return false;

    return authorizationClaim.Split(",").Contains("CanEditUnit");
);

这只是查找Authorization 声明,如果存在,则将其除以, 并检查CanEditUnit 值是否存在。

如果您想要一些更可重用的东西,您可以创建自己的自定义 AssertionRequirement 类。下面是一个可能看起来像的示例:

public class CustomAssertionRequirement : AssertionRequirement

    public CustomAssertionRequirement(string requiredValue)
        : base(ctx => HandleRequirement(ctx, requiredValue))  

    private static bool HandleRequirement(AuthorizationHandlerContext ctx, string requiredValue)
    
        var authorizationClaim = ctx.User.FindFirstValue("Authorization");

        if (authorizationClaim == null)
            return false;

        return authorizationClaim.Split(",").Contains(requiredValue);
    

为了使用这个新类,您可以将其作为要求添加到AuthorizationPolicyBuilder(而不是使用RequireAssertion),如下所示:

policy.AddRequirements(new CustomAssertionRequirement("CanEditUnit"));

【讨论】:

以上是关于如何使用 ASP.NET Core 中的声明检查 JWT 中的权限?的主要内容,如果未能解决你的问题,请参考以下文章

在 ASP .NET Core Web API 请求期间检查用户声明

ASP.NET Core JWT 和声明

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

更新 ASP.NET One Core 中的声明值

在 ASP.NET Core Identity 中使用 Authorize 属性检查多个策略之一

如何使用 Web Api Asp.Net Core 实现基于声明的授权?