簡體   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