2013-06-24 69 views
16

我在指定類方法上的兩個單獨的授權屬性時遇到問題:如果兩個屬性中的任何一個屬性都爲true,則允許用戶訪問。方法上的多個授權屬性

的Athorization類看起來是這樣的:

[AttributeUsage(AttributeTargets.All, AllowMultiple = true)] 
public class AuthAttribute : AuthorizeAttribute { 
. . . 

和行動:

[Auth(Roles = AuthRole.SuperAdministrator)] 
[Auth(Roles = AuthRole.Administrator, Module = ModuleID.SomeModule)] 
public ActionResult Index() { 
    return View(GetIndexViewModel()); 
} 

有沒有辦法解決這個問題的方式還是我需要重新考慮我的方法呢?

這是要在MVC2中運行。

回答

21

多個AuthorizeAttribute實例由MVC處理,就好像它們與AND一起加入一樣。如果你想要一個OR的行爲,你將需要實現自己的邏輯進行檢查。最好實施AuthAttribute以承擔多種角色,並使用OR邏輯執行自己的檢查。

另一種解決方案是使用標準AuthorizeAttribute並實現自定義IPrincipal,它將執行bool IsInRole(string role)方法來提供'OR'行爲。

一個例子是在這裏: https://stackoverflow.com/a/10754108/449906

+0

找到更多關於這方面的信息纔有可能創造另一個授權屬性(即'公共類MultipleAuthOrAttribute {'',將作爲輸入幾個'AuthAttributes'? – adamse

+2

您無法創建接受其他屬性實例的屬性。屬性類構造函數只能接受編譯時有效值/原始類型。這就是爲什麼'AuthorizeAttribute'將角色作爲一個字符串。 –

+1

有人可以提供官方文檔的參考,該文檔支持多個'AuthorizeAttribute'實例作爲邏輯'AND'處理的聲明。在我自己的測試中,過濾器的順序看起來很重要,第一個過濾器最後說了驗證是否成功。 –

19

有一個更好的辦法做到這在asp.net的後續版本,你都可以做OR和AND的作用。這是通過約定來完成的,列出單個授權中的多個角色將執行一個OR,其中添加多個授權屬性將執行AND。

或示例

[Authorize(Roles = "PowerUser,ControlPanelUser")] 

和示例

[Authorize(Roles = "PowerUser")] 
[Authorize(Roles = "ControlPanelUser")] 

您可以通過以下鏈接 https://docs.microsoft.com/en-us/aspnet/core/security/authorization/roles