簡體   English   中英

使用JWT承載令牌和自定義AuthorizeAttribute標記角色枚舉

[英]Flag Role Enum with JWT Bearer Token and Custom AuthorizeAttribute

我目前正在使用MVC 5Web API 2構建具有JWT和OWIN身份驗證的Web API 2 我似乎所有的工作都按預期進行。 但是,我現在想實施Roles授權,並且目前遇到了麻煩。

我知道您可以在端點上指定Authorize屬性,如下所示:

[Authorize(Roles="Admin")]

我想為基於角色的授權構建一個更強大的類型化解決方案,以更好地處理我所需要的東西,這就是我遇到的麻煩。

現在,當用戶向我的oauth/token端點提交usernamepassword ,我將生成JWT ,這將在數據庫中查找該用戶並返回已為該用戶存儲的enum Flag 獲取用戶信息后,我將為我的ClaimsIdentity創建一個Role ClaimClaimsIdentity所示:

private void GenerateIdentityRoles()
{
    _identity.AddClaim(new Claim(ClaimTypes.Role, _userRole.Roles.ToString()));
}

為了進一步說明,在GenerateIdentityRoles令牌的過程中調用了GenerateIdentityRoles方法,而_userRole是我從數據庫返回的經過驗證的用戶記錄。 Roles參數是我存儲的枚舉標志。

從那里,我的Bearer令牌返回給用戶,然后可以用它來命中任何裝飾有[Authorize]屬性的端點。

有沒有一種方法可以創建從AuthorizeAttribute類繼承的自定義屬性,該自定義屬性的工作方式與[Authorize(Roles="Admin")] 但是,除了指定字符串類型外,我還可以指定[AuthorizeRolesAttribute(UserRoleEnum.Admin)] ,然后在我的AuthorizeRolesAttribute類中,從JWT Bearer令牌中獲取傳入的Roles Claim ,將其轉換回Enum Flag,然后檢查看看它是否包含用HasFlag方法指定的標志?

請注意,目前我不太擔心轉換令牌中的Role Claim字符串返回,但更重要的是獲取它。 另外,這對我來說是一個非常新的概念,所以我實際上只是在學習。 如果我的理解有誤,我將完全接受推理和其他解決方案。

是的,這應該可行。

子類AuthorizeAttribute ,並重寫IsAuthorized方法。 在檢查操作是否具有AllowAnonynous屬性和您不想弄亂的其他詳細信息之后,調用此方法來檢查特定用戶是否具有訪問權限。 這是默認實現查看用戶名和角色名稱的地方,但是如果需要,您可以在此處執行完全不同的操作。

Github上提供了Asp.Net MVC和Web API的源代碼。 您可以在此處看到AuthorizeAttribute源。

不必那么復雜。

如果要使其強類型化,則可以使用這樣的Constants類:

 public static class Constants
    {
        public static class Roles
        {
            public const string Admin = "Admin";
            public const string User = "User";
        }

    }

[Authorize(Roles=Constants.Roles.Admin)]

不需要枚舉。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM