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


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 segunda parte do artigo veremos como criar roles usando a API Identity.

Criando Roles com RoleManager na ASP .NET Core

Usando a API do Identity podemos criar Roles ou Perfis que contém um conjunto de permissões para realizar um conjunto de atividades em nossa aplicação.

Um exemplo de definição de roles que podemos usar seria:

    1. Admin - Para fazer a administração e atribuir funções aos funcionários;
    2. Gerentes - Para cuidar das necessidades do cliente e funcionários;
    3. Netework - Para manter a Internet da em funcionamento, de maneira segura;
    4. Security - Para proteger as instalações da organização;


Definimos assim 4 roles com um conjunto de permissões e a seguir podemos atribuir usuários a essas roles.

Para criar, acessar e gerenciar as roles podemos usar a classe RoleManager e para representar as roles podemos usar IdentityRole que possui as seguintes propriedades:

    1. Id - fornece um identificador exclusivo da role;
    2. Name - define o nome da role;
    3. Users - Retorna uma coleção de objetos IdentityUserRole que representam membros da role;

Assim a classe RoleManager executa todas as operações CRUD, criando, lendo, atualizando e excluindo roles da tabela AspNetRoles.

Para dizer à classe RoleManager para trabalhar com a classe IdentityRole, especificamos a classe IdentityRole como o argumento genérico de RoleManager. Ex: RoleManager<IdentityRole>:

public class AdminstrationController : Controller
{
    private readonly RoleManager<IdentityRole> roleManager;
    public AdministrationController(RoleManager<IdentityRole> roleManager)
    {
        this.roleManager = roleManager;
    }
    ...
}

Aqui a instância de RoleManager será disponibilizada para qualquer controlador ou view pelo sistema de injeção de dependência nativo da ASP .NET Core.

Para iniciar a criação da role precisamos criar uma ViewModel que vamos chamar de  CreateRoleViewModel.

Vamos criar esta classe na pasta ViewModels definindo a propriedade RoleName que vai identificar o nome da role:

using System.ComponentModel.DataAnnotations;
namespace FuncionariosWeb.ViewModels
{
    public class CreateRoleViewModel
    {
        [Required]
        [Display(Name = "Role")]
        public string RoleName { get; set; }
    }
}

A seguir vamos criar um controlador chamado AdminstrationController onde vamos definir os métodos Action CreateRole para Get e POST para criar uma role.

using FuncionariosWeb.ViewModels;
using Microsoft.AspNetCore.Identity;
using Microsoft.AspNetCore.Mvc;
using System.Threading.Tasks;
namespace FuncionariosWeb.Controllers
{
    public class AdministrationController : Controller
    {
        private readonly RoleManager<IdentityRole> roleManager;
        public AdministrationController(RoleManager<IdentityRole> roleManager)
        {
            this.roleManager = roleManager;
        }
        [HttpGet]
        public IActionResult CreateRole()
        {
            return View();
        }
        [HttpPost]
        public async Task<IActionResult> CreateRole(CreateRoleViewModel model)
        {
            if (ModelState.IsValid)
            {
                // precisamos apenas especificar o nome único da role
                IdentityRole identityRole = new IdentityRole
                {
                    Name = model.RoleName
                };
                // Salva a role na tabela AspNetRole
                IdentityResult result = await roleManager.CreateAsync(identityRole);
                if (result.Succeeded)
                {
                    return RedirectToAction("index", "home");
                }
                foreach (IdentityError error in result.Errors)
                {
                    ModelState.AddModelError("", error.Description);
                }
            }
            return View(model);
        }
    }
}

Vamos entender o código acima:

Injetamos uma instância de RoleManager no construtor via injeção de dependência nativa da ASP .NET Core.

Especificamos o nome único da Role via propriedade RoleName.

Salvamos a role na tabela AspNetRoles usando o método CreateAsync().

Agora só falta criar a view CreateRole.cshtml.

@model CreateRoleViewModel
@{
    ViewBag.Title = "Cria Nova Role";
}
<h3>Criar Role</h3>
<form asp-action="CreateRole" method="post" class="mt-3">
    <div asp-validation-summary="All" class="text-danger">
    </div>
    <div class="form-group row">
        <label asp-for="RoleName" class="col-sm-2 col-form-label"></label>
        <div class="col-sm-10">
            <input asp-for="RoleName" class="form-control" placeholder="Nome">
            <span asp-validation-for="RoleName" class="text-danger"></span>
        </div>
    </div>
    <div class="form-group row">
        <div class="col-sm-10">
            <button style="width:auto" type="submit" class="btn btn-primary" style="width:auto">
                Criar Nova Role
            </button>
        </div>
    </div>
</form>

Pronto.  Já temos tudo pronto para criar uma nova role.

Podemos executar nossa aplicação e navegar para http://localhost:XXXX/administration/createrole

E teremos a página para criar a role exibida conforme abaixo:

Vamos incluir o role Admin e clicar no botão Criar Nova Role:

A seguir podemos abrir o banco de dados e verificar na tabela AspNetRoles a nossa role criada:

No próximo artigo veremos como retornar e exibir todas as roles existentes usando o Identity.

"Porque o reino de Deus não é comida nem bebida, mas justiça, e paz, e alegria no Espírito Santo."
Romanos 14:17

Referências:


José Carlos Macoratti