.net 如何在MVC中已声明类级验证的情况下使用操作级验证重写自定义筛选器属性
我的控制器在类级别使用一个属性,该属性只允许一个角色访问。此控制器有20多个操作。但是,对于一个操作,我还需要一个角色才能访问。我已经在类级别声明了属性过滤器,因此它对于控制器类中的所有操作都可以正常工作。但是现在我只想在同一个控制器中为一个操作重写这个。有可能吗?我使用的是.Net版本4.5 过滤器属性实现如下所示:.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
[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个过滤器按照过滤器执行顺序生效:全局->控制器->操作