2016-06-09 64 views
0

這個問題確實適用於任何可以爲單個用戶分配多個角色的網站或企業系統。在ASP.NET網站中,管理員應該分配多個角色嗎?

在ASP.NET身份您有IdentityUserIdentityRole,其中用戶可以有0個或更多角色。控制器動作,然後由[Authorize(Roles = "roleName")]

保護鑑於有以下3個簡單角色,一個簡單的概念系統:

Administrator 
Manager 
User 

...誰應該獲得所有控制器操作的簡單管理型用戶:

JoeAdmin 

和下面的示例Web API控制器:

public IHttpActionResult GetForUsersAndAbove() 
{ 
    // 
} 

public IHttpActionResult GetForAdminsOnly() 
{ 
    // 
} 

如果系統被設計成:

  1. JoeAdmin分配只是一個角色 - 管理員,或者
  2. JoeAdmin分配給管理員,經理和用戶?

我問這個問題的動機是授權控制器操作。如果JoeAdmin只分配管理員角色,然後根據下面的授權屬性,他將無法訪問GetForUsersAndAbove()因爲他不是用戶角色

[Authorize(Roles = "User")] 
public IHttpActionResult GetForUsersAndAbove() 
... 

[Authorize(Roles = "Administrator")] 
public IHttpActionResult GetForAdminsOnly() 
... 

那麼接下來的問題是一個成員,應該GetForUsersAndAbove()是裝飾着

[Authorize(Roles = "User, Manager, Administrator")] 

讓他可以訪問它嗎? OR

是應系統分配JoeAdmin基本上所有角色的,這樣他就可以訪問所有的控制方法,即使它們被打上[Authorize(Roles = "User")]

編輯

如果我用下面的約定控制器操作

[Authorize(Roles = "User")] 
public IHttpActionResult GetForUsers() 

並預計,如果JoeAdmin要訪問此方法,他也應該是User角色的成員,這導致用戶管理屏幕上的用戶界面問題:

以下是一個場景:由於管理用戶的責任,您是系統的新用戶。您添加一個新用戶JaneAdmin意圖使她可以完全/不受限制地訪問系統。您會看到3個複選框:AdministratorManagerUser。沒有文檔來指導你,你勾選了哪個複選框?如果我把自己放在用戶的鞋子裏,我會直覺地打勾「管理員」,期望它能提供完整的訪問權限。我也可以想象JaneAdmin發現她被鎖定在簡單的用戶級操作之外時的挫折感。所以用戶界面要求所有3個複選框都應該打勾......以滿足系統的授權方面,但是會導致用戶體驗不佳。

那麼,人們通常如何處理這個問題?

回答

1

你自己回答你自己的問題,真的。爲用戶提供多個角色比在控制器上指定所有可能的角色要容易,因爲角色存儲在數據庫中,並且可以隨時處理,但向控制器添加角色需要重建和重新部署項目。

並非所有的管理員都可以訪問所有區域。我見過系統允許管理員創建用戶並修改密碼,但不允許查看個人病歷。

所以是的,我非常建議爲用戶分配多個角色 - 從長遠角度來看,維護起來會更容易。

編輯:所以你想要超級管理員用戶,可以訪問任何地方,而無需特別提到,在所有的控制器?聽起來像你需要覆蓋AuthorizeAttirbute添加管理員角色總是授權。

事情是這樣的:

public class MyAuthorizeAttribute : AuthorizeAttribute 
{ 
    protected override bool AuthorizeCore(HttpContextBase httpContext) 
    { 
     var authorized = base.AuthorizeCore(httpContext); 
     if (!authorized) 
     { 
      // The user is not authorized => no need to go any further 
      return false; 
     } 


     if(httpContext.User.IsInRole("Admin")) 
     { 
      return true; 
     } 

     return base.AuthorizeCore(httpContext); 
    } 
} 

再裝點這個新屬性所有的控制器:

[MyAuthorize(Roles = "User")] 
public ActionResult MySuperAction() 
{ 
    ... 
} 
+0

感謝。你的第二點意義重大。根據您的建議,請在問題中查看我的編輯。 – BCA

+0

@BCA查看我的更新 – trailmax

+0

我從來沒有想到這是可能的 - 謝謝 – BCA

相關問題