2014-11-01 26 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 
... 
相關問題