[英]Flag Role Enum with JWT Bearer Token and Custom AuthorizeAttribute
我目前正在使用MVC 5
和Web API 2
構建具有JWT和OWIN身份驗證的Web API 2
。 我似乎所有的工作都按預期進行。 但是,我現在想實施Roles授權,並且目前遇到了麻煩。
我知道您可以在端點上指定Authorize
屬性,如下所示:
[Authorize(Roles="Admin")]
我想為基於角色的授權構建一個更強大的類型化解決方案,以更好地處理我所需要的東西,這就是我遇到的麻煩。
現在,當用戶向我的oauth/token
端點提交username
和password
,我將生成JWT
,這將在數據庫中查找該用戶並返回已為該用戶存儲的enum Flag
。 獲取用戶信息后,我將為我的ClaimsIdentity
創建一個Role Claim
, ClaimsIdentity
所示:
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.