Model view controller 如何使[授权]属性更灵活?

Model view controller 如何使[授权]属性更灵活?,model-view-controller,asp.net-mvc-5,authorize-attribute,Model View Controller,Asp.net Mvc 5,Authorize Attribute,我有一个MVC5应用程序,我只允许某些经过身份验证的用户访问控制器中的特定操作,从而锁定了它。我使用类顶部的authorize属性,只允许我想在登录后获得访问权限的用户。我通过将以下属性放置在类的顶部来执行此操作 [Authorize(Users="user1,user2")] 这太棒了!但是,如果我不想每次向该特定控制器添加新用户时都重新编译和部署应用程序,该怎么办 我想我可能会在我的web.config文件中添加这个作为一个键,就像这样 <appSettings> <

我有一个MVC5应用程序,我只允许某些经过身份验证的用户访问控制器中的特定操作,从而锁定了它。我使用类顶部的authorize属性,只允许我想在登录后获得访问权限的用户。我通过将以下属性放置在类的顶部来执行此操作

[Authorize(Users="user1,user2")]
这太棒了!但是,如果我不想每次向该特定控制器添加新用户时都重新编译和部署应用程序,该怎么办

我想我可能会在我的web.config文件中添加这个作为一个键,就像这样

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

但是,当我尝试在控制器中访问此密钥时,例如:[Authorize(Users=ConfigurationManager.AppSettings[“Users”])],我收到一个错误:无法解析符号“AppSettings”


有没有办法做到这一点?

不要使用
用户
参数,而是使用
角色
参数

[Authorize(Roles="CanExecuteActions")]

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

我不确定为什么会接受没有回答该问题的答案。不管怎样,我认为为未来的旅行者添加一个答案是值得的

虽然此功能不是现成提供的,但通过编写您自己的authorize属性当然是可能的

公共类ConfigAuthorize:AuthorizeAttribute
{
受保护的覆盖bool AuthorizeCore(HttpContextBase httpContext)
{
var allowedUsers=ConfigurationManager.AppSettings[“CoolActionAllowedUsers”];
var allowedUsersArray=allowedUsers.Split(',');
if(httpContext.User.Identity!=null&&allowedUsersArray.Contains(httpContext.User.Identity.Name))
{
返回true;
}
返回false;
}
}
要使用该属性,请执行以下操作:

[ConfigAuthorize]
公共行动结果CoolAction(){
//...
}
在上面的代码中,当您在
AuthorizeCore
中执行授权时,来自
CoolActionAllowedUsers
的配置值将被拉入内存,并且将验证当前经过身份验证的用户是否在允许的用户列表中。如果你对你的配置文件做了更改,那就不会有问题;应用程序池将自动重新启动,下次运行代码读取配置文件时,将读取新值


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

感谢您的回复。我已经知道怎么做了。我真正想知道的是,我是否可以按照我在问题中提出的方式来做,但我会给你一些回答的道具,并将其视为“不,不能做”。是的,用户参数并没有那么有用或可伸缩。从长远来看,你扮演一个特殊的角色可以避免很多头痛。谢谢你的回答,这实际上回答了我的问题。尽管我100%同意作为最佳实践的推荐鞋;在Stackoverflow上,我经常看到响应者的意见掩盖了用户的实际要求。我们都有权拥有自己的观点,但通常有人提出关于如何做某事的问题是有正当理由的。话虽如此,我为你们各自的答案给了你们两个道具。我的答案是给出需要的,而不一定是想要的。对于“如何将方形销钉装入圆孔”这一问题,更合适的答案显然是“不要使用方形销钉,而是使用圆形销钉”,而不是“使用锯子,切割销钉,打磨销钉,重新喷漆,然后再安装”。这个答案当然回答了这个问题,尽管我不明白为什么它会被简单地使用
角色