我的控制器正在使用类级别的属性,该属性只允许一个角色访问。该控制器有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
}
}
答案 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个过滤器将按照过滤器的执行顺序生效:全局->控制器->操作。