ASP .NET Core 3.1 - Usando o Identity de cabo a rabo - XIX


Hoje vamos continuar a série de artigos mostrando como usar o ASP .NET Core Identiy na versão 3.1 da ASP .NET .Core e do EF Core.

Continuando a décima oitava parte do artigo veremos como exibir os usuários cadastrados.

Exibindo os usuários cadastrados

Os usuários gerenciados pelo Identity e cadastrados em nossa aplicação ficam armazenados na tabela AspNetUsers, assim para acessar e exibir esses usuários teremos que usar os recursos da classe UserManager que acessa a tabela e retorna os usuários.

Para isso vamos criar um método Action ListUsers HttpGet no controlador AdministrationController que vai usar o serviço UserManager injetado no construtor do controlador para retorna a lista de usuários:

        [HttpGet]
        public IActionResult ListUsers()
        {
            var users = userManager.Users;
            return View(users);
        }

Agora precisamos criar a view ListUsers para exibir os dados dos usuários em uma página:

@model IEnumerable<ApplicationUser>
@{
    ViewBag.Title = "Todos os usuários";
}
<h2>Usuários</h2>
@if (Model.Any())
{
    <a asp-action="Register" asp-controller="Account"
       class="btn btn-primary mb-3" style="width:auto">
      Novo Usuário
    </a>
    foreach (var user in Model)
    {
        <div class="card mb-3">
            <div class="card-header">
                ID : @user.Id
            </div>
            <div class="card-body">
                <h5 class="card-title">@user.UserName</h5>
            </div>
            <div class="card-footer">
                <a href="#" class="btn btn-danger">Editar</a>
                <a href="#" class="btn btn-danger">Deletar</a>
            </div>
        </div>
    }
}
else
{
    <div class="card">
        <div class="card-header">
         Sem usuários registrados
        </div>
        <div class="card-body">
            <h5 class="card-title">
                Use o botão abaixo para criar um usuário
            </h5>
            <a class="btn btn-primary" style="width:auto"
               asp-controller="Account" asp-action="Register">
                  Criar um novo usuário
            </a>
        </div>
    </div>
}

Como agora estamos exibindo os usuários vamos ajustar o menu Gerencia Roles de forma a ter duas opções:  uma para os usuários e outra para as roles.

Assim vamos alterar o nome do menu para Gerenciar e vamos incluir duas opções : Usuários e Roles

Para isso vamos alterar o código da view _Layout.cshtml conforme abaixo:

              ...
              <div class="collapse navbar-collapse" id="collapsibleNavbar">
                    <ul class="navbar-nav ml-auto">
                        @*Se o usuário esta logado exibir o link de logout*@
                        @if (SignInManager.IsSignedIn(User))
                        {
                            <li class="nav-item">
                                <form method="post" asp-controller="account" asp-action="logout">
                                    <button type="submit" style="width:auto"
                                            class="nav-link btn btn-link py-0">
                                        Logout @User.Identity.Name
                                    </button>
                                </form>
                            </li>
                            @if (User.IsInRole("Admin"))
                            {
                               <li class="nav-item dropdown">
                                    <a class="nav-link dropdown-toggle" href="#" id="navbarDropdownMenuLink"
                                       data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
                                        Gerenciar
                                    </a>
                                    <div class="dropdown-menu" aria-labelledby="navbarDropdownMenuLink">
                                        <a class="dropdown-item" asp-controller="Administration"
                                           asp-action="ListUsers">Usuários</a>
                                        <a class="dropdown-item" asp-controller="Administration"
                                           asp-action="ListRoles">Roles</a>
                                    </div>
                                </li>
                            }
                        }
                        else
                        {
                            <li class="nav-item">
                                <a class="nav-link" asp-controller="account" asp-action="register">
                                    Registrar
                                </a>
                            </li>
                            <li class="nav-item">
                                <a class="nav-link" asp-controller="account" asp-action="login">
                                    Login
                                </a>
                            </li>
                        }
                    </ul>
                </div>
          ...

Criamos um dropdownlist com o menu Gerenciar e as opções que serão exibidas para usuários do perfil Admin.

Vamos alterar o código do método Action Register do controlador AccountController para verificar se o usuário logado faz parte do perfil Admin e neste caso vamos direcioná-lo para o método Action ListRoles.

        public async Task<IActionResult> Register(RegisterViewModel model)
        {
            if (ModelState.IsValid)
            {
                // Copia os dados do RegisterViewModel para o IdentityUser
                var user = new ApplicationUser
                {
                    UserName = model.Email,
                    Email = model.Email,
                    Cidade = model.Cidade
                };
                // Armazena os dados do usuário na tabela AspNetUsers
                var result = await userManager.CreateAsync(user, model.Password);
                // Se o usuário foi criado com sucesso, faz o login do usuário
                // usando o serviço SignInManager e redireciona para o Método Action Index
                if (result.Succeeded)
                {
                    // Se o usuário estiver logado e for do perfil Admin
                    // então o usuário é o usuário Admin que esta criando
                    // um novo usuário, assim vamos direcioná-lo para o
                    // usuário Admin para a Action ListRoles
                    if (signInManager.IsSignedIn(User) && User.IsInRole("Admin"))
                    {
                        return RedirectToAction("ListUsers", "Administration");
                    }
                    await signInManager.SignInAsync(user, isPersistent: false);
                    return RedirectToAction("index", "home");
                }
                // Se houver erros então inclui no ModelState
                // que será exibido pela tag helper summary na validação
                foreach (var error in result.Errors)
                {
                    ModelState.AddModelError(string.Empty, error.Description);
                }
            }
            return View(model);
        }

Agora é só alegria...

Executando o projeto vamos fazer o login com um usuário com perfil Admin e veremos o menu Gerenciar exibindo as opções Usuários e Roles. Clicando em Usuários iremos acessar a lista de usuários cadastrados.

Veja o resultado a seguir:

No próximo artigo vamos mostrar como editar os usuários cadastrados.

Disse Jesus: "Se, pois, o Filho vos libertar, verdadeiramente sereis livres."
João 8:36

Referências:


José Carlos Macoratti