2009-11-12 74 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文件时也是如此。