2016-12-07 21 views
0

我目前正在使用MVC 5Web API 2構建具有JWT和OWIN認證的Web API。我似乎有所有這些按預期工作。不過,我現在想實施角色授權,目前正在打牆。帶JWT承載令牌和自定義授權屬性的標誌角色枚舉

我知道,你的終點,你可以指定Authorize屬性是這樣的:

[Authorize(Roles="Admin")] 

我想建立基於角色的授權,以更好地處理什麼,我需要更強的類型化的解決方案,而這正是我打了一堵牆。

現在我有當用戶提交一個usernamepasswordoauth/token端點這看起來在我的數據庫中的用戶,並返回已經存儲了用戶enum Flag產生我JWT。獲取用戶信息後,我創建了我的ClaimsIdentity像這樣一個Role Claim

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

只是爲了進一步澄清GenerateIdentityRoles方法被稱爲我的生成令牌和_userRole從數據庫返回我的驗證的用戶記錄的過程。 Roles參數是我存儲的枚舉標誌。

從那裏我的Bearer令牌返回給用戶,然後它可以用於擊中用[Authorize]屬性裝飾的任何端點。

有沒有一種方法可以創建一個繼承自AuthorizeAttribute類的自定義屬性,該類將以與[Authorize(Roles="Admin")]相同的方式工作?但是,被指定的字符串類型,而不是我可以指定[AuthorizeRolesAttribute(UserRoleEnum.Admin)]然後我AuthorizeRolesAttribute類內搭傳入Roles Claim從智威湯遜承載令牌,將其轉換回枚舉標誌,然後檢查,看它是否包含指定的標誌HasFlag方法?

請注意,我不是太在意,此刻與轉換從令牌的角色聲明的字符串返回,但更獲得它。此外,這對我來說都是一個非常新的概念,所以我真的只是在學習。如果我的理解有誤,我完全接受推理和其他解決方案。

回答

0

是的,這應該是可能的。

子類的AuthorizeAttribute,並重寫IsAuthorized方法。 這是在檢查操作是否具有AllowAnonynous屬性和其他不想混淆的細節之後,調用以檢查特定用戶是否有權訪問的方法。 這是默認實現查看用戶名和角色名稱的地方,但如果您願意,您可以在這裏做一些完全不同的事情。

Asp.Net MVC和Web API的源代碼可在Github上。 您可以看到AuthorizeAttribute源here

+0

謝謝您的回覆。看起來您提供給'AuthorizeAttribute'源的鏈接已損壞。你能爲我複查嗎?謝謝! – scapegoat17

+0

你的意思是這個[link](https://github.com/ASP-NET-MVC/aspnetwebstack/blob/master/src/System.Web.Http/AuthorizeAttribute.cs)?如果是這樣,我沒有看到一種方法來覆蓋傳入的角色聲明。你有什麼想法如何實現這一目標? – scapegoat17

0

它不必那麼複雜。

如果你想讓它強類型,你可以使用一個常量類是這樣的: -

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

    } 

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

沒有必要進行枚舉。

+0

謝謝你的回覆。但是,如果我要去遵循常量路由,那麼我可能只是使用字符串類型作爲角色參數......它本質上是做同樣的事情。這也不利於我通過我的角色聲明發送枚舉值的事實。 – scapegoat17

+0

道歉...我意識到現在用戶可以擁有多個角色嗎? – Derek