如何在MVC

时间:2016-03-18 06:37:53

标签: .net asp.net-mvc asp.net-mvc-4 filter custom-attributes

我的控制器正在使用类级别的属性,该属性只允许一个角色访问。该控制器有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 个答案:

答案 0 :(得分:2)

看看这个答案(见案例2)https://stackoverflow.com/a/16713334/2564920

基本上,您需要第二个属性来表示覆盖。

所以属性变为:

    [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
    }   
}

答案 1 :(得分:0)

还有一种选择,您可以实际设置AllowMultiple = false。

通过这种方式,只有1个过滤器将按照过滤器的执行顺序生效:全局->控制器->操作。