.net 如何在MVC中已声明类级验证的情况下使用操作级验证重写自定义筛选器属性

.net 如何在MVC中已声明类级验证的情况下使用操作级验证重写自定义筛选器属性,.net,asp.net-mvc,asp.net-mvc-4,filter,custom-attributes,.net,Asp.net Mvc,Asp.net Mvc 4,Filter,Custom Attributes,我的控制器在类级别使用一个属性,该属性只允许一个角色访问。此控制器有20多个操作。但是,对于一个操作,我还需要一个角色才能访问。我已经在类级别声明了属性过滤器,因此它对于控制器类中的所有操作都可以正常工作。但是现在我只想在同一个控制器中为一个操作重写这个。有可能吗?我使用的是.Net版本4.5 过滤器属性实现如下所示: [AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, Inherited = true, Allow

我的控制器在类级别使用一个属性,该属性只允许一个角色访问。此控制器有20多个操作。但是,对于一个操作,我还需要一个角色才能访问。我已经在类级别声明了属性过滤器,因此它对于控制器类中的所有操作都可以正常工作。但是现在我只想在同一个控制器中为一个操作重写这个。有可能吗?我使用的是.Net版本4.5

过滤器属性实现如下所示:

[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, Inherited = true, AllowMultiple = true)]
public class RequireModulePermissionAttribute : AuthorizeAttribute
{
   //code goes here
}
控制器类:

[RequireModulePermission("Admin")]
public class AdministrationController : Controller
{
    [HttpPost]
    [RequireModulePermission("Admin","Supervisor")]
    public ActionResult CreateUser(UserViewModel userVM)
    {
       //code goes here
    }   
}

看看这个答案(看看案例2)

实际上,您需要第二个属性来表示覆盖

所以你变成:

    [AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, Inherited = true, AllowMultiple = true)]
    public class RequireModulePermissionAttribute : AuthorizeAttribute
    {
        public override void OnAuthorization(AuthorizationContext filterContext)
        {
            var action = filterContext.ActionDescriptor;
            if (action.IsDefined(typeof(OverrideRequireModulePermissionAttribute ), true)) return;
            //code goes here
        }
    }

    [AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, Inherited = true, AllowMultiple = true)]
    public class OverrideRequireModulePermissionAttribute : AuthorizeAttribute
    {
       public override void OnAuthorization(AuthorizationContext filterContext)
       {
           base.OnAuthorization(filterContext);
       }
    } 
你使用它的方式是什么

[RequireModulePermission("Admin")]
public class AdministrationController : Controller
{
    [HttpPost]
    [OverrideRequireModulePermission("Admin","Supervisor")]
    public ActionResult CreateUser(UserViewModel userVM)
    {
       //code goes here
    }   
}

看看这个答案(看看案例2)

实际上,您需要第二个属性来表示覆盖

所以你变成:

    [AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, Inherited = true, AllowMultiple = true)]
    public class RequireModulePermissionAttribute : AuthorizeAttribute
    {
        public override void OnAuthorization(AuthorizationContext filterContext)
        {
            var action = filterContext.ActionDescriptor;
            if (action.IsDefined(typeof(OverrideRequireModulePermissionAttribute ), true)) return;
            //code goes here
        }
    }

    [AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, Inherited = true, AllowMultiple = true)]
    public class OverrideRequireModulePermissionAttribute : AuthorizeAttribute
    {
       public override void OnAuthorization(AuthorizationContext filterContext)
       {
           base.OnAuthorization(filterContext);
       }
    } 
你使用它的方式是什么

[RequireModulePermission("Admin")]
public class AdministrationController : Controller
{
    [HttpPost]
    [OverrideRequireModulePermission("Admin","Supervisor")]
    public ActionResult CreateUser(UserViewModel userVM)
    {
       //code goes here
    }   
}

有一种替代方法,您可以实际设置AllowMultiple=false


这样,只有1个过滤器按照过滤器执行顺序生效:全局->控制器->操作。

还有一个替代方法,您可以实际设置AllowMultiple=false

这样,只有1个过滤器按照过滤器执行顺序生效:全局->控制器->操作