如何使[Authorize]属性更灵活?

时间:2014-06-13 17:34:32

标签: model-view-controller asp.net-mvc-5 authorize-attribute

我有一个MVC 5应用程序,我通过仅允许某些经过身份验证的用户访问我的控制器中的特定操作来锁定。我利用类顶部的authorize属性,只允许我想在登录后获得访问权限的用户。我这样做时将以下属性放在我的班级顶部...

[Authorize(Users="user1,user2")]

这很棒!但是,如果我不希望每次想要将新用户添加到此特定控制器时重新编译和部署应用程序,该怎么办?

我以为我可以在我的web.config文件中添加这个作为一个关键字,如此......

<appSettings>
  <add users="user1,user2"/>
</appSettings>

但是当我尝试在我的控制器中访问此键时,如下所示:[Authorize(Users = ConfigurationManager.AppSettings [“users”])]我收到错误:无法解析符号'AppSettings'。

有办法做到这一点吗?

2 个答案:

答案 0 :(得分:1)

不使用Users参数,而是使用Roles参数。

[Authorize(Roles="CanExecuteActions")]

现在,您可以通过为用户提供此角色来管理用户有权访问您的控制器。任何没有角色的用户都无法执行控制器的任何操作。

答案 1 :(得分:1)

我不确定为什么一个没有回答问题的答案被接受了。无论如何,我认为可能值得为未来的旅行者添加一个答案。

虽然此功能尚未开箱即用,但通过编写您自己的授权属性,这当然是可能的。

public class ConfigAuthorize : AuthorizeAttribute
{
    protected override bool AuthorizeCore(HttpContextBase httpContext)
    {
        var allowedUsers = ConfigurationManager.AppSettings["CoolActionAllowedUsers"];
        var allowedUsersArray = allowedUsers.Split(',');

        if (httpContext.User.Identity != null && allowedUsersArray.Contains(httpContext.User.Identity.Name))
        {
            return true;
        }

        return false;
    }
}

并使用属性:

[ConfigAuthorize]
public ActionResult CoolAction() {
    //...
}

在上面的代码中,当您在AuthorizeCore中执行授权时,来自CoolActionAllowedUsers的配置值将被拉入内存,如果当前经过身份验证的用户位于允许的用户列表中,则会对其进行验证。如果您对配置文件进行了更改,那么它将不会成为问题;应用程序池将自动重新启动,下次代码运行以读取配置文件时,将读取新值。

我完全同意@Shoe应该使用角色。管理代码中的用户列表只是一件痛苦的事。事实上,在工作中,每当我收到一个随机用户访问页面的请求时,我总是需要设置一个组。但是,上面的代码也可以应用于角色列表。