繁体   English   中英

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

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

我有一个有关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 Claim中,但是如果将某些内容设置为False,则它根本不会出现在该Claim中。

然后,我想检查用户是否在策略中具有该特权:

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

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

有没有一种方法可以使用包含而不是等于检查策略? 如果没有,我该怎么办?

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

正如您在问题中所建议的那样,看起来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"));

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM