【问题标题】:How to authorize a set of controllers without placing the annotation on each one?如何授权一组控制器而不在每个控制器上放置注释?
【发布时间】:2017-03-23 02:38:43
【问题描述】:

我有一组控制器,每个控制器都用于每种授权类型。例如,A 类授权将有一组控制器,每个控制器都需要 A 类授权。有没有办法在某处放置一个[Authorize(Role="Class A")] 属性,该属性将应用于每个控制器,而不必用相同的属性装饰每个控制器?

【问题讨论】:

    标签: asp.net-mvc asp.net-mvc-3 controller authorize authorize-attribute


    【解决方案1】:

    您可以初始化从基本控制器派生的那些控制器。即将您的属性放在控制器基类上,并确保其中的每个控制器都派生自基类。

    [Authorize(Role="Class A")]
    public class CustomBaseController : Controller{}
    
    public class AController: CustomBaseController{}
    
    public class BController: CustomBaseController{}
    

    【讨论】:

    • 另外,根据您拥有的控制器数量,您可以轻松地将讨厌的 [Authorize] 属性放在顶部。有了一个基本控制器,您似乎无论如何都必须弄乱每个控制器。
    • 是的,但是使用基本控制器是初始化和检查所有控制器的一些数据的最佳实践。也许您想使用自定义 Authorize 属性。对单个控制器上的自定义授权属性进行更改也很容易。
    【解决方案2】:

    是的,有一种方法,让所有这些 A-class 控制器派生自一个基本控制器,并在其上放置 AuthorizeAttribute

    [Authorize(Role="Class A")]
    public class AController : Controller 
    {
        ...
    } 
    
    public class AFirstController : AController // Gets it's parent attribute
    {
        ...
    } 
    
    public class ASecondController : AController // Gets it's parent attribute
    {
        ...
    } 
    

    【讨论】:

      【解决方案3】:

      这里有 2 或 3 条回复解释了如何做到这一点……但您也可以使用 Fluent Security 在一个文件中处理所有控制器 + 操作设置。一些好处(来自他们的网站):

      基于代码的配置

      没有属性或 xml 会使您的代码混乱。

      低印记

      Fluent Security 不会像野火一样在您的应用程序中蔓延。您的配置可以保存在一个文件中。

      【讨论】:

      • URL 现在默认为域停放页面。 Fluent Security 仍然存在吗?
      【解决方案4】:

      您可以从基本控制器继承,例如

      [Authorize(Role = "Class A")]
      public class ClassARequiredController : Controller {}
      

      否则您会查看全局过滤器,根据您的问题,我假设您有多个角色和集合,所以我认为全局过滤器不适合您。

      【讨论】:

        【解决方案5】:

        基类上设置属性并继承,创建最适合您的场景的层次结构...

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2013-08-29
          • 2014-05-31
          • 2014-03-25
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多