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

How to check privileges in JWT using Claims in ASP.NET Core?

我对 Claims、JWT 和 ASP.Net Core 有疑问。再次......(问候克里斯)。所以...

我有我的 JWT 声明:

"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 Claim 是否等于 CanEditUnit.

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

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

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

policy.RequireAssertion(ctx =>
{
    var authorizationClaim = ctx.User.FindFirstValue("Authorization");

    if (authorizationClaim == null)
        return false;

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

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

如果您想要一些可重复使用的东西,您可以创建自己的自定义 AssertionRequirement class。这是一个可能看起来像的例子:

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);
    }
}

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

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