检查用户是否在角色中或没有嵌套?

Check if user is in role or not nestedly?

有什么方法可以检查用户是否嵌套了特定角色?例如

@if(User.IsInRole("Admin"){

  <div class="div1"> </div>

  @if(User.IsInRole("AdminAssitant"){
     <div class="div2"> </div>
  }

}

我的意思是,如果用户是 Admin,我想同时显示 divs,否则只显示 div2。我不想这样创建:

@if(User.IsInRole("Admin"){

  <div class="div1"> </div>
  <div class="div2"> </div>
}

 @if(User.IsInRole("AdminAssitant"){
   <div class="div2"> </div>
 }

因为这只是一个示例,所以我有非常复杂的场景。

因为是嵌套的,如果角色不是admin,那么AssistantAdmin语句永远不会被检查。因此,您将无法完全像那样完成嵌套检查。

RolePrincipal.IsInRole 方法无法让您在角色层次结构中向上或向下爬升。您可以使用 RolePrincipal.GetRoles 来获取用户所属的所有角色的数组,如果该角色存在于该数组中,则可能编写您的安全性。

https://msdn.microsoft.com/en-us/library/system.web.security.roleprincipal.getroles(v=vs.110).aspx

对其他人如何处理这个问题非常感兴趣。

您的视图示例:

@{
    ViewBag.Title = "Example";
    string[] roles = ((RolePrincipal)User).GetRoles();
}

@if (roles.Contains("Admin"))
{
    <div class="div1">Weeee</div>
    if (roles.Contains("AdminAssitant"))
    {
        <div class="div2">Whoooa</div>
    }
}

角色并非真正设计用于嵌套。这通常是由于误解了 "role" 是什么。严格来说,角色只是一种特权:诸如 CanEditCanDelete 之类的东西。它们应该是建立起来的。因此,例如 "Admin" 只是具有一组所有可用角色的用户。创建一个实际的 Admin 角色只是暗示每个其他角色的成员资格的捷径,只是因为您有时可能会忘记在系统中为每个 "Admin" 用户分配一个新角色。

AdminAdminAssistant 之类的上下文中发言,您属于 成员的领域,并且组 本质上是分层的。一个组可以是另一个组的一部分,并且权限会向下传递到所有级别。

回到这里的实际问题,您只需要对层次结构建模,因为实际上无法 层次结构强加给角色。这实质上意味着做类似的事情:

@if (User.IsInRole("Admin") || User.IsInRole("AdminAssistant")) {

    <div class="div1"> </div>

    @if (User.IsInRole("AdminAssistant")) {
        <div class="div2"> </div>
    }
}

这样,任一角色都会获得 div1,但只有 AdminAssistant 会获得 div2。