Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/261.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 当为某个动作MVC添加相同的AuthorizeAttribute时,如何覆盖全局AuthorizeAttribute?_C#_Asp.net_.net_Asp.net Mvc - Fatal编程技术网

C# 当为某个动作MVC添加相同的AuthorizeAttribute时,如何覆盖全局AuthorizeAttribute?

C# 当为某个动作MVC添加相同的AuthorizeAttribute时,如何覆盖全局AuthorizeAttribute?,c#,asp.net,.net,asp.net-mvc,C#,Asp.net,.net,Asp.net Mvc,这是我的CustomAuthorizeAttribute类: public class CustomAuthorizeAttribute : AuthorizeAttribute { public string ControllerName { get; set; } public override void OnAuthorization(AuthorizationContext filterContext) { if (Con

这是我的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()控制器名在执行特定操作时总是getnull

这是因为我不能将全局授权属性和相同的态度一起用于某些特定操作吗??为什么?我一直认为,如果我为特定操作添加一些属性,并将该属性添加到全局过滤器,则特定操作将获得高度优先级

更新1:


如果问题源为2,则执行所有操作。那么,当我为某些操作添加相同的authorized属性时,如何覆盖全局授权筛选器?(唯一不同的是参数,我只是希望在为某些操作添加一个参数时忽略全局授权)

更改自定义属性上的to Order属性,以便首先触发它:

[AdminAuthorize(ControllerName="pass", Order=999)]
public ActionResult Index()
{
      return View();
}
这当然是一个例子


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

我通过组合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
...

您可以手动更改属性的Order属性,以便首先触发它。谢谢。但是我可以设置全局过滤器的顺序吗?然后,我不需要为每个特定操作设置顺序。是的,在默认构造函数中设置一个默认值,并使用自定义值创建一个重载构造函数I'm register global filter use
filters.Add(new AdminAuthorizeAttribute(),1)看起来最小订单号是高度优先,请编辑您的答案。但现在的问题是:它不会覆盖全局过滤器,2个过滤器都将执行。。。。。