通过MVC应用程序中的配置文件动态配置授权角色

时间:2009-11-12 01:41:58

标签: asp.net-mvc configuration authorization

我目前有以下属性装饰其中一个动作方法。

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

   return View();
}

目前,只有Admin角色的用户才能调用此方法,但这会发生变化。无论如何,我可以在配置文件中存储授权角色列表,而不是将其硬编码到源代码中吗?

编辑:角色会随着时间的推移而发生变化,超过1个角色需要访问权限。 即角色A OR 角色B可以访问的用户。

3 个答案:

答案 0 :(得分:5)

无法使用标准authorize属性执行此操作,但您可以使用自己的自定义authorize属性扩展authorize属性,并让它使用配置文件来确定控制器/操作与角色集之间的映射。

答案 1 :(得分:0)

但您可以使用类似

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

然后Controller可以将授权属性设为

[Authorize(Roles = AppRoles.Admin)]

答案 2 :(得分: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文件的任何更改生效之前,必须重新启动网站,即使我尝试更改逻辑以便在{{1}上读取JSON文件访问者而不是get