2014-11-01 43 views
2

这是我CustomAuthorizeAttribute类:为某些Action MVC添加相同的AuthorizeAttribute时,如何覆盖全局AuthorizeAttribute?

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(),ControllerName总是得到null执行特定的Action时。

难道是因为我不能使用全局的authorizeAttribute和相同的attibute对于一些特定的动作在一起?为什么?我一直认为如果我为特定的Action添加一些AuthorizeAttribute,并将Attribute添加到全局过滤器,则特定的Action将获得高度优先

UPDATE1:

如果问题来源是2授权的所有执行。那么我怎么覆盖全球授权过滤器当我添加一个相同的AuthorizeAttribute某些行动? (只不同的是帕拉姆,我只是希望它忽略了全球授权当我添加一个对一些行动)

+0

您可以手动更改该属性的Order属性,以使其成为fir先编辑。 – 2014-11-01 13:16:39

回答

1

变化对自定义属性顺序属性,所以它会先启用:

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

这是一个例子offcourse。

是的,你可以这样覆盖全局过滤器。

+0

谢谢。但我可以只设置全局过滤器的顺序吗?那么我不需要为每个特定的操作设置顺序。 – qakmak 2014-11-01 14:19:26

+0

是的,在默认的构造函数中设置一个默认值,并创建一个自定义值的重载构造函数 – 2014-11-01 15:07:32

+0

我注册全局过滤器使用''filters.Add(new AdminAuthorizeAttribute(),1);''看起来像最小订单号是身高优先,请编辑您的答案。但现在的问题是:它不覆盖全局过滤器,2个过滤器都会执行..... – qakmak 2014-11-01 15:51:39

2

我这样做是有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; 
    } 
} 

在全球CONFIGS:

filters.Add (new AuthorizeByRolesAttribute ("Admin"), 255); 

在控制器简单:

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