【问题标题】:Can the [Authorize] attribute be set globally for all controllers?可以为所有控制器全局设置 [Authorize] 属性吗?
【发布时间】:2014-03-23 21:54:42
【问题描述】:

目前将 [Authorize] 放在控制器类或特定操作上。是否可以为所有控制器集中设置 [Authorize] 属性,例如防止未经身份验证的使用。然后可以在特定控制器上定义更具体的 [Authorize] 属性,例如

[Authorize(Roles="Admin, SuperUser")]

谢谢。

【问题讨论】:

  • 您考虑过使用动作过滤器吗?

标签: asp.net-mvc asp.net-mvc-3


【解决方案1】:

这应该可以工作(放入 Application_Start):

GlobalFilters.Filters.Add(new AuthorizeAttribute() { Roles = "Admin, SuperUser" });

【讨论】:

  • 谢谢。一旦全局应用,将 [Authorize(Roles="User") 应用到特定操作会产生什么影响。它会覆盖它还是将授权扩展到“Admin”、“SuperUser”、“User”?
  • 您必须定义 AuthorizeAttribute 吗?只是放置它会返回一条错误消息。
  • 非常感谢。工作级长
  • 要对 REST API 执行相同操作,请将其添加到 WebApiConfig.Register(): config.Filters.Add(new AuthorizeAttribute() { Roles = "Admin, SuperUser" });
【解决方案2】:

另一种选择是让控制器从基控制器类继承,并将 AuthorizeAttribute 放在那里。

Take a look at this answer

然后您可以覆盖具有特定角色、用户等子类的基本 AuthorizeAttribute。

[Authorize]
public class BaseController : Controller{}

public class ChildController: BaseController{}

[Authorize(Role = "Role A")]
public class AnotherChildController: BaseController{}

【讨论】:

  • 谢谢。这是一个有趣的回答。一个可能有“AdminController”、“UserController”作为子控制器。添加额外的 [Authorize(Roles="Role B")] 会有什么影响。这会覆盖还是扩展?
  • 我后来发现了 FluentSecurity,我是从同一个链接获得的! :)
  • 仅供参考,您的解决方案将受到需要身份验证的登录的​​影响。请参阅上面的链接以获取解决方案。
  • 稍微考虑过这种方法,虽然可以做到,但在控制器代码文件中更改控制器名称感觉有点“硬编码”。我不得不承认我喜欢从一个文件控制控制器的 FluentSecurity 方法,并且控制器仍然是普通的旧基本控制器。
  • 这似乎更糟。它不那么简单,并且有同样的机会有人忘记从基类继承而不是忘记添加 [Authorize] 属性。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-01-09
  • 1970-01-01
  • 2017-03-04
  • 2014-03-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多