获取登录用户的角色列表

时间:2019-02-28 14:30:10

标签: c# asp.net-mvc razor asp.net-identity

使用我的代码,我只能从列表中获得第一个角色。如何使用剃刀显示登录用户具有的所有角色

@using System.Security.Claims

@{
    var claimsIdentity = User.Identity as System.Security.Claims.ClaimsIdentity;
    var roleOfUser = claimsIdentity != null ? claimsIdentity.Claims.FirstOrDefault(x => x.Type == ClaimTypes.Role).Value : "User";
}

<div class="col-md-9 text-center " id="logoutForm">
    @Html.DisplayName("Profile " + roleOfUser)
</div>

3 个答案:

答案 0 :(得分:0)

更改Linq查询以返回IEnumerable,并使用@foreach循环显示值

@using System.Security.Claims

@{
 var claimsIdentity = User.Identity as System.Security.Claims.ClaimsIdentity;
 var rolesOfUser = claimsIdentity != null ? claimsIdentity.Claims.Where(x => 
 x.Type == ClaimTypes.Role).Select(c=>c.Value) : "User";
}

<div class="col-md-9 text-center " id="logoutForm">

  @foreach(var item in rolesOfUser)
  {
    Html.DisplayName("Profile " + item)
  }
</div>

答案 1 :(得分:0)

我刚刚将SingleOrDefault替换为ToList,并将字符串连接在一起:

@using System.Security.Claims

@{
    var claimsIdentity = User.Identity as System.Security.Claims.ClaimsIdentity;
    var roleOfUser = claimsIdentity != null ? string.Join(", ", claimsIdentity.Claims.Where(x => x.Type == ClaimTypes.Role).Select(x=>x.Value).ToList()): "User";
}

  <div class="col-md-9 text-center " id="logoutForm">
     @Html.DisplayName("Profile " + roleOfUser)
  </div>

您真的很近,但是您使用的是SingleOrDefault,在这种情况下,它返回一个条目或nullToList将所有结果返回到该查询。 string.Join使用,作为分隔符将所有字符串连接在一起。

答案 2 :(得分:0)

您只是获得用户的第一个角色并显示它。如果要全部获取,请改用产生IEnumerable的方法之一。

例如,您可以执行以下操作:

@using System.Security.Claims
@{
    Claim[] rolesOfUser = null;
    var claimsIdentity = User.Identity as System.Security.Claims.ClaimsIdentity;
    if (claimsIdentity != null)
    {
        rolesOfUser = claimsIdentity.Claims.Where(x => x.Type ==ClaimTypes.Role).ToArray();
    }
}

@if (rolesOfUser != null && rolesOfUser.Any())
{
    <div class="col-md-9 text-center " id="logoutForm">
        <ul class="list-group user-roles">
            @foreach(var role in rolesOfUser){
                <li class="list-group-item">
                    @Html.DisplayName("Profile " + role)
                </li>
            }
        </ul>
    </div>
}
else
{
    <div class="alert alert-danger">
        No roles where found!
    </div>
}

在这里,您将获得具有角色类型的用户的所有声明,并将它们显示在列表中。

最佳做法

虽然上述解决方案有效,但这并不是最干净的方法。最佳做法是在控制器上创建一个模型,并将其作为模型传递给视图。该模型应仅包含要在视图上显示的元素。这样一来,您就不会最终将用于提取角色的逻辑与表示逻辑混合在一起,并且视图将变得更干净。

  

更新:   有关更清洁的实现,请参见此提琴:https://dotnetfiddle.net/hM7prf

希望这会有所帮助!