Получить список ролей вошедшего в систему пользователя - PullRequest
0 голосов
/ 28 февраля 2019

С моим кодом я могу получить только первую роль из списка.Как бы я сделал, чтобы показать все роли, которые имеет вошедший в систему пользователь, используя бритву

@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 голосов
/ 28 февраля 2019

Я только что заменил 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, который возвращает одну запись или null вэтот случай.ToList возвращает все результаты этого запроса.string.Join объединяет все строки, используя , в качестве разделителя.

0 голосов
/ 28 февраля 2019

Вы просто получаете первую роль пользователя и отображаете ее.Если вы хотите получить все из них, используйте один из методов, которые выдают 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

Надеюсь, это поможет!

0 голосов
/ 28 февраля 2019

Измените запрос 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>
...