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


Hoje vamos iniciar uma série de artigos onde vou mostrar como usar o ASP .NET Core Identiy na versão 3.1 da ASP .NET .Core e do EF Core.

Antes da chegada do .NET 5.0, quando provavelmente, haverá outras mudanças, vamos iniciar esta série de artigos mostrando como usar o Identity na ASP .NET Core.

Será uma série bem enxuta e objetiva onde vou procurar me ater ao que é essencial para que você possa usar o Identity em seus projetos.

Para iniciar eu vou criar um projeto ASP .NET Core MVC com EF Core para realizar o CRUD básico usando o Scaffold e assim ter um projeto de partida.

A tiítulo de exemplo vamos criar uma aplicação ASP .NET Core MVC para gerenciar informações de funcionários, e par aisso, vamos definir uma classe Funcionario que será o nosso modelo de domínio; vamos usar também uma enumeração Departamento para criar os departamentos onde os funcionários estão lotados.

Tudo bem simples, pois o objetivo é focar no Identity.

recursos usados:

Criando o projeto inicial no VS 2019

Abra o VS 2019 Community e crie um novo projeto via menu File-> New Project;

Selecione o template ASP .NET Core Web Application, e, Informe o nome da solução IdentityTotal e o nome do projeto FuncionariosWeb.

A seguir selecione .NET Core e ASP .NET Core 3.1 e marque o template Web Application e as configurações conforme figura abaixo:

Observe que não vamos definir agora a autenticação em nosso projeto vamos fazer isso depois.

Depois que o projeto foi criado, precisamos adicionar a referência aos seguintes pacotes:

Nota Para instalar use o comando Install-Package <nome> -version 3.1.3

Esses pacotes são necessários para realizarmos o acesso ao banco de dados SQL Server e aplicarmos o Migrations ao modelo de domínio e assim gerar o banco de dados e as tabelas.

Definindo o modelo de domínio

Na pasta Models do projeto crie a classe Funcionario e a enumeração Departamento:

using System.ComponentModel.DataAnnotations;
namespace FuncionariosWeb.Models
{
    public class Funcionario
    {
        public int FuncionarioId { get; set; }
        [Required, MaxLength(80, ErrorMessage = "Nome não pode exceder 80 caracteres")]
        public string Nome { get; set; }
        [RegularExpression(@"^[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+$",
        ErrorMessage = "Email com formato inválido")]
        [Required]
        public string Email { get; set; }

        public Departamento? Departamento { get; set; }
    }
}

Enumeração Departamento:

namespace FuncionariosWeb.Models
{
    public enum Departamento
    {
        TI,
        RH,
        Contabilidade,
        Marketing,
        Vendas
    }
}

Criando o contexto e registrando como um serviço e aplicando o Migrations

Agora crie uma pasta Context no projeto e nesta pasta crie o arquivo AppDbContext:

using FuncionariosWeb.Models;
using Microsoft.EntityFrameworkCore;
namespace FuncionariosWeb.Context
{
    public class AppDbContext : DbContext
    {
        public AppDbContext(DbContextOptions<AppDbContext> options)
      : base(options)
        { }
        public DbSet<Funcionario> Funcionarios { get; set; }
    }
}
No método ConfigureServices do arquivo Startup registre o serviço do contexto:
...
  public void ConfigureServices(IServiceCollection services)
   {
            services.AddDbContext<AppDbContext>(
                 options => options.
                 UseSqlServer(Configuration.GetConnectionString("DefaultConnection")));
            services.AddControllersWithViews();
   }
...
E no arquivo appsettings.json inclua a string de conexão com o banco de dados usando sua instância local:
{
  "ConnectionStrings": {
    "DefaultConnection": "Data Source=Macoratti;Initial Catalog=FuncionariosDBWeb;Integrated Security=True"
  },
  "Logging": {
    "LogLevel": {
      "Default": "Information",
      "Microsoft": "Warning",
      "Microsoft.Hosting.Lifetime": "Information"
    }
  },
  "AllowedHosts": "*"
}

Para criar o banco de dados e a tabela com as configurações definidas abra uma janela do Package Manager Console e digite o comando:

add-migration Inicial

Isso vai gerar o script de migração na pasta Migrations que será criada no projeto. Não havendo nenhum erro então emita o comando :

update-database

Isso vai criar o banco de dados e as tabelas no SQL Server.

Nota: Para alimentar a tabela com dados você pode usar a classe de Contexto - AppDbContext e definir a sobrescrita do método OnModelCreating :

        protected override void OnModelCreating(ModelBuilder modelBuilder)
        {
            modelBuilder.Entity<Funcionario>().HasData(
            new Funcionario
            {
                FuncionarioId = 1,
                Nome = "Macoratti",
                Departamento = Departamento.TI,
                Email = "macoratti@yahoo.com"
            });
        }

Criando o controlador

Agora vamos criar o controlador para gerenciar as informações dos funcionários e fazer o CRUD.

Clique com o botão direito do mouse sobre a pasta Controllers e a seguir clique em Add->Controller;

A seguir escolha a opção MVC Controller with views, using Entity Framework e clique em Add;

Na janela a seguir informe o modelo Funcionario, o data context AppDbContext e informe o nome FuncionariosController e clique em Add:

Ao final será criado o controlador e as views.

Ajustando a view _Layout.cshtml para ter um link para exibir o acessso aos funcionários temos:

..

<div class="navbar-collapse collapse d-sm-inline-flex flex-sm-row-reverse">
 <ul class="navbar-nav flex-grow-1">
   <li class="nav-item">
      <a class="nav-link text-dark" asp-area="" asp-controller="Home" asp-action="Index">Home</a>
    </li>
    <li class="nav-item">
  <a class="nav-link text-dark" asp-area="" asp-controller="Funcionarios" asp-action="Index">Funcionarios</a>       
</li>
</ul>
</div>
..

Agora é só alegria...

Executando o projeto teremos:

Pronto. Este será o nosso projeto de partida para implementar o Identity.

No próximo artigo vamos iniciar incluindo o Identity no projeto e a seguir explorar seus recursos.

Pegue o projeto completo aqui: IdentityTotal.zip  (sem as referências)

"E este evangelho do reino será pregado em todo o mundo, em testemunho a todas as nações, e então virá o fim."
Mateus 24:14

Referências:


José Carlos Macoratti