2015-04-27 158 views
3

如果需要,可以提供更多信息,請先在此發佈!授權角色組合

我目前正在使用標準角色授權(webpages_roles/webpages_usersinroles)功能管理asp.net mvc4中的網站。

這工作細到一個點,actionresults內控制器適當裝飾有標記,如:

[Authorize(Roles = "Admin")] 

或多個角色,其中一個可以訪問:

[Authorize(Roles = "Admin, Manager")] 

我需要做,是授權多個角色,"AND"而不是"OR"的情況。 例如用戶必須既是"Manager"角色又是"Finance"角色才能訪問控制器。只有"Manager"或僅有"Finance"的用戶,但不能同時訪問操作結果。

這將如何實現?搜索結果顯示人們談論擴展授權屬性,但如果有關於如何做到這一點的具體建議或更直接的話,在這種情況下它將非常有用!

Spike的解決方案有細微的修改工作,在for each使用var創建char數據類型,在IsInRole功能需要string

最終代碼:

public class AndAuthorize : AuthorizeAttribute 
{ 

    protected override bool AuthorizeCore(HttpContextBase httpContext) 
    { 
     IPrincipal user = httpContext.User; 

     try 
     { 
      if (Roles != null && Roles.Any()) 
      { 
       foreach (string r in Roles.Split(',')) 
       { 
        if (!user.IsInRole(r)) 
         return false; 
       } 
      } 
      return true; 
     } 
     catch (Exception ex) 
     { 
      return false; 
     } 

    } 
} 

回答

3

是,應對的最佳方式這是擴展授權屬性。

以下是你可以實現一個授權的類的實例「與」

public class AndAuthorize : AuthorizeAttribute 
{ 
    protected override bool AuthorizeCore(HttpContextBase httpContext) 
    { 
     try 
     { 
      if (Roles != null && Roles.Any()) 
      { 
       foreach(var role in Roles){ 
       if(!httpContext.User.IsInRole(role)) 
        return false; 
       } 
      } 
      return true; 
     } 
     catch (Exception ex) 
     { 
      return false; 
     } 
    } 
} 

現在,你只需要設置[AndAuthorize(角色=「管理員,經理」),因爲延長授權類,將讓您訪問默認屬性(角色和用戶)。

然後,您可以使用原來的授權,爲「OR」,這一個「與」案件

+0

感謝您的幫助秒殺,這是99%的完美,我只是稍作修改代碼。我將編輯原始帖子以突出問題和解決方案。 – Zerk

+0

啊,是的,你是完全正確的,我忘了角色不是一個數組,而是一個字符串:D我的壞!很高興我可以幫助:) – Spike

1

我還沒有試過,但應該檢查兩個角色工作。

基本上,您可以將一個屬性應用於授權控制器,另一個屬性用於操作方法。

[Authorize(Roles = "Manager")] //role1 
public class YourController : Controller 
{ 
    [Authorize(Roles = "Finance")] //role2 
    public ActionResult Index() 
    { 
    } 
} 

如果你有不同的組合:

[Authorize(Roles = "role1, role2, role3")] 
public class YourController : Controller 
{ 
    [Authorize(Roles = "role4, role5, role6")] 
    public ActionResult Index() 
    { 
    } 
} 
+0

感謝您的建議,不幸的是,因爲它站在控制器內的一些ActionResults需要父母的角色,有些不會。這是一個恥辱,因爲這將是一個快速和簡單的解決方案! – Zerk