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

莫拉修

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

我有我的 JWT 和Claim

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

等等。

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

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

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

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

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

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

柯克·拉金

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何在ASP.NET Core中从JWT检索ClaimsPrincipal

使用 jwt 授权在 Asp.net core 中检查用户验证

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

使用ASP.NET Core无法从JWT令牌获得声明

ASP.NET Core中每页的权限

ASP.NET Core 2.0 API中JWT令牌中的自定义声明

从ASP.NET Core中的API读取JWT令牌

如何在asp.net core 2.2中实现Cookie基础身份验证和jwt?

如何使JWT在Autorest生成的SDK中工作?(ASP.NET Core 2.0)

使用依赖注入替换ASP.NET Core中的JWT承载选项

如何使用ASP.NET Core中的JWT授权重定向到401上的登录页面

如何在 ASP.NET Core 的 ActionExecutingContext 中检查 AllowAnonymousAttribute?

如何在ASP.net Core Identity中实现基于权限的授权?

JWT:如何从声明中的特定键获取值列表。C#Asp.Net核心

使用授权过滤器在asp.net core中实现基于权限的授权

如何使用基于声明的授权保护ASP.NET Core 2.1中的静态文件夹

直接从令牌ASP Net Core 2.1获取JWT声明

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

如何在ASP.NET Core Web API(无第三方)中实现JWT刷新令牌?

如何在.net Core 2.2中实现JWT令牌

在ASP.NET Core Web Api中使用JWT授权检查IP

如何在asp.net core 2.2中制作一个可以调用数据库检查用户声明授权用户的中间件

如何使用IFileInfo删除ASP.NET Core中的文件

在 ASP.NET Core 中,如何使用 sqlite

与自定义身份验证中的角色权限相比,ASP.NET Core Identity中的角色声明

如何将 JWT 用于 asp.net Core

在ASP.NET Core的Swagger中使用JWT(授权:承载)

如何在ASP.NET Core MVC中基于用户表中的字段添加声明?

.NET Core中的JWT授权-401错误