代码之家  ›  专栏  ›  技术社区  ›  Morasiu

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

  •  0
  • Morasiu  · 技术社区  · 8 年前

    我有一个关于声明、JWT和ASP.NET核心的问题。再一次。。。(问候克里斯)。所以…

    我的JWT 索赔 :

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

    等。

    这个 索赔 具有所有权限,该用户包含(例如:如果用户在数据库中将caneditUnit设置为true,则caneditUnit将保存在 授权 声明,但如果某个东西设置为假,它就不会出现在声明中。

    然后,我想检查用户在类似这样的策略中是否具有这种特权:

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

    但它可能会检查 授权 索赔等于 CANEDIT单元 .

    有办法检查保险单吗 包含 而不是 平等 ?如果没有,我应该怎么做?

    我找到了 this 但我不知道怎么用。

    1 回复  |  直到 8 年前
        1
  •  2
  •   Kirk Larkin    8 年前

    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

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