这是我的 CustomAuthorizeAttribute 类:
public class CustomAuthorizeAttribute : AuthorizeAttribute
{
public string ControllerName { get; set; }
public override void OnAuthorization(AuthorizationContext filterContext)
{
if (ControllerName != "pass")
{
// stop or redirect
}
}
}
我将它注册到所有 Controller 可以使用的全局过滤器:
public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
filters.Add(new AdminAuthorizeAttribute());
}
对于某些特定的操作,我使用参数 ControllerName 添加它:
[AdminAuthorize(ControllerName="pass")]
public ActionResult Index()
{
return View();
}
但是现在问题出在 OnAuthorization() 中,执行特定 Action 时 ControllerName 总是得到 null 。
那是因为我不能将全局 authorizeAttribute 和相同的 Attibute 用于某些特定的 Action 吗?为什么?我一直认为如果我为特定 Action 添加一些 AuthorizeAttribute ,并将 Attribute 添加到 global filter ,则特定 Action 将获得 高度优先级 。
更新 1:
如果问题源是 2 授权所有执行。那么当我为某些操作添加相同的 AuthorizeAttribute 时,如何 覆盖全局授权过滤器 ? (唯一不同的是参数,我只是希望它在我为某些操作添加一个时忽略全局授权)
最佳答案
我通过结合 Order 属性和在上下文项中标记请求已由我的属性授权来完成此操作:
public class AuthorizeByRolesAttribute : AuthorizeAttribute
{
private const string AuthorizedContextItemName = "_AuthorizedByRoles";
public AuthorizeByRolesAttribute (params string[] roles)
{
this.Order = 0;
this.Roles = string.Join (",", roles);
}
public override void OnAuthorization (AuthorizationContext filterContext)
{
if (filterContext.RequestContext.HttpContext.Items[AuthorizedContextItemName] != null)
return;
base.OnAuthorization (filterContext);
filterContext.RequestContext.HttpContext.Items[AuthorizedContextItemName] = this.Roles ?? string.Empty;
}
}
在全局配置中:
filters.Add (new AuthorizeByRolesAttribute ("Admin"), 255);
在 Controller 中简单地:
[AuthorizeByRoles ("NotAdminButCanAccess")]
public class MyController : Controller
...
关于c# - 为某些 Action MVC 添加相同的 AuthorizeAttribute 时如何覆盖全局 AuthorizeAttribute?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/26689639/