2009-11-12 78 views
1

我目前擁有以下屬性來裝飾其中一個操作方法。通過MVC中的配置文件動態配置授權角色

[Authorize(Roles = "Admin")] 
public ActionResult DoAdminTask() 
{ 
//Do something 

    return View(); 
} 

目前,只有管理員角色的用戶可以調用此方法,但這會改變。無論如何,我可以在配置文件中存儲授權角色列表,而不是將其硬編碼到源代碼中?

編輯:角色將隨着時間而改變,並且超過1個角色將需要訪問。 即以角色A 角色B可以訪問的用戶。

回答

5

無法使用標準授權屬性來執行此操作,但可以使用您自己的自定義授權屬性來擴展授權屬性,並讓它使用配置文件來確定控制器/操作與角色集之間的映射。

+0

是的,經過更多的谷歌搜索,看起來像是唯一的出路。 – 2009-11-12 20:52:35

0

,但你可以使用類似

public static class AppRoles 
{ 
    public const string Users = "UsersRoleName"; 
    public const string Admin = "AdminRoleName"; 
} 

,然後控制器可以授權屬性作爲

[Authorize(Roles = AppRoles.Admin)] 
0

我覺得這個問題值得與代碼示例的答案...以@ tvanfosson的建議擴展AuthorizeAttribute班,這是我想出的(批評不止是歡迎)。

AuthorizeFromConfiguration.cs

public class AuthorizeFromConfiguration: AuthorizeAttribute 
{ 
    public new string Roles 
    { 
     get { 
      return base.Roles; 
     } 
     set { 
      var config = new ConfigurationBuilder() 
       .SetBasePath(Environment.CurrentDirectory) 
       .AddJsonFile("authorization.json") 
       .Build(); 
      base.Roles = config[value]; 
     } 
    } 
} 

authorization.json

{ 
    "Parts": { 
     "Create": "contoso.com\\MyWebApp_CreateNewPart", 
     "Edit": "contoso.com\\MyWebApp_EditPart" 
    } 
} 

示例用法

[AuthorizeFromConfiguration(Roles = "Parts:Create")] 
public class CreateModel : PageModel 
{ 
    //... 
} 

注意:在我的測試中,在對authorization.json文件所做的任何更改生效之前,必須重新啓動網站,即使當我嘗試更改邏輯以便在get訪問器而不是set上讀取JSON文件時也是如此。