繁体   English   中英

为某些Action MVC添加相同的AuthorizeAttribute时,如何覆盖全局AuthorizeAttribute?

[英]How override the global AuthorizeAttribute when add same AuthorizeAttribute for some Action MVC?

这是我的CustomAuthorizeAttribute类:

public class CustomAuthorizeAttribute : AuthorizeAttribute
{

       public string ControllerName { get; set; }


      public override void OnAuthorization(AuthorizationContext filterContext)
      {
           if (ControllerName != "pass")
           {
            // stop or redirect
           }

      }
}

我将其注册到所有控制器可以使用的全局过滤器中:

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,并将该属性添加到全局过滤器中,则该特定的Action将获得height优先级

UPDATE1:

如果问题源是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);

只需在控制器中:

[AuthorizeByRoles ("NotAdminButCanAccess")]
public class MyController : Controller
...

将custom属性更改为Order属性,以便首先触发它:

[AdminAuthorize(ControllerName="pass", Order=999)]
public ActionResult Index()
{
      return View();
}

这是一个例子。

是的,您可以通过这种方式覆盖全局过滤器。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM