当类级别验证已在 MVC 中声明时,如何使用操作级别验证覆盖自定义过滤器属性

Nan*_*ani 1 .net asp.net-mvc filter custom-attributes asp.net-mvc-4

我的控制器在类级别使用一个属性,它只允许一个角色访问。这个控制器有 20 多个动作。但是对于仅一项操作,我还需要一个角色才能获得访问权限。我已经在类级别声明了属性过滤器,以便它对控制器类中的所有操作都能正常工作。但现在我只想在同一个控制器中覆盖一个动作。有没有可能?我正在使用 .Net 4.5 版。

过滤器属性实现是这样的:

[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, Inherited = true, AllowMultiple = true)]
public class RequireModulePermissionAttribute : AuthorizeAttribute
{
   //code goes here
}
Run Code Online (Sandbox Code Playgroud)

控制器类:

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

Ala*_*sai 5

看看这个答案(看看案例2)/sf/answers/1169933411/

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

所以你的属性变成:

    [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);
       }
    } 
Run Code Online (Sandbox Code Playgroud)

你使用它就像

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