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

4

我目前在一个操作方法中使用以下属性修饰符。

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

   return View();
}

目前只有管理员角色的用户可以调用此方法,但这将会改变。我是否可以将授权角色列表存储在配置文件中,而不是硬编码到源代码中?

编辑:角色将随时间改变,并且需要访问超过1个角色。 即,无论是A角色还是B角色的用户都可以访问。

3个回答

5

使用标准授权属性无法完成此操作,但是您可以使用自己的自定义授权属性扩展授权属性,并使其使用配置文件来确定控制器/操作与角色集之间的映射。


是的,在更多的搜索之后,看起来那似乎是唯一的方法。 - undefined

1

我觉得这个问题值得用一个代码示例来回答...借鉴了@tvanfosson的建议,我想出了以下这个方案(欢迎批评)。

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
{
    //...
}

注意:在我的测试中,无论我如何更改逻辑以使JSON文件在get访问器而不是set访问器上读取,网站都必须重新启动才能使authorization.json文件的任何更改生效。

0
但是你可以使用类似的东西

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

然后控制器可以具有授权属性

[Authorize(Roles = AppRoles.Admin)]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接