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


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 primeira parte do artigo vamos agora implementar o Identity em nosso projeto.

A ASP .NET Core Identity é um sistema de associação ou Membership. Ele nos permite criar, ler, atualizar e excluir contas de usuário; também da suporte à confirmação de conta, autenticação, autorização, recuperação de senha, autenticação de dois fatores com o SMS.

Ele também suporta provedores de login externos como Microsoft, Facebook, Google etc. Vamos ver todos esses recursos nesta série de artigos.

Adicionando o Identity no projeto

A seguir teremos um roteiro para adicionar o Identity em um projeto ASP.NET Core MVC sem autenticação.

Vamos utilizar a solução IdentityTotal criada no artigo anterior.

A primeira coisa a fazer é incluir no projeto FuncionariosWeb o pacote: 

Microsoft.AspNetCore.Identity.EntityFrameworkCore  ( A versão atual estável este pacote é a versão 3.1.3.)

Após isso, abra o arquivo AppDbContext que representa o contexto da nossa aplicação e altere o código da classe fazendo com que ela herde de IdentityDbContext:

 public class AppDbContext : IdentityDbContext
 {
    .....
 }

Nossa classe AppDbContext deve herdar da classe IdentityDbContext ao invés da classe DbContext.

Isso é necessário porque o IdentityDbContext fornece todas as propriedades DbSet necessárias para gerenciar as tabelas de identidade no SQL Server. Veremos mais adiante todas as tabelas que o ASP.NET Core Identity gera.

Se você percorrer a cadeia hierárquica da classe IdentityDbContext, verá que ela é herdada da classe DbContext. Porisso  você não precisa herdar explicitamente da classe DbContext se sua classe está herdando da classe IdentityDbContext.

A seguir no método ConfigureServices da classe Startup vamos incluir o código abaixo:

  public void ConfigureServices(IServiceCollection services)
  {
          ...
            services.AddIdentity<IdentityUser, IdentityRole>()
                         .AddEntityFrameworkStores<AppDbContext>();

          ...
   }

Explicando o código:

O método AddIdentity() adiciona a configuração padrão do sistema de identidade para os tipos de usuário e perfis ou role especificados.

A classe IdentityUser é fornecida pela ASP.NET Core e contém propriedades para UserName, PasswordHash, Email etc. Essa é a classe usada por padrão pelo Identity para gerenciar usuários registrados do seu aplicativo.

Se você deseja armazenar informações adicionais sobre os usuários registrados, como Sexo, Cidade etc, vai ter que criar uma classe personalizada derivada do IdentityUser. Nesta classe personalizada, adicione as propriedades adicionais necessárias e conecte-a a essa classe em vez da classe IdentityUser interna.

Da mesma forma, IdentityRole também é uma classe interna fornecida pelo ASP.NET Core Identity e contém informações de perfil ou role.

Queremos armazenar e recuperar informações de Usuário e do Perfil (Role) dos usuários registrados usando o EntityFrameWork Core para o SQL Server subjacente. Especificamos isso usando AddEntityFrameworkStores <AppDbContext>() e  passando nossa classe DbContext do aplicativo como o argumento genérico.

Agora vamos incluir o middleware de autenticação no pipeline e permitir a autenticação em nossa aplicação. Para isso inclua o método UseAuthentication na classe Configure conforme abaixo:

    public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
   {
             ...
            app.UseRouting();            
            app.UseAuthentication();
            app.UseAuthorization();
            app.UseEndpoints(endpoints =>
            {
                endpoints.MapControllerRoute(
                    name: "default",
                    pattern: "{controller=Home}/{action=Index}/{id?}");
            });
     }

Como queremos poder autenticar usuários antes que a solicitação atinja o middleware MVC  é importante adicionarmos o middleware de autenticação antes do MVC no pipeline de processamento de solicitações que esta definido por app.UseEndPoints().

Concluímos assim as configurações para poder usar o Identity e agora vamos aplicar o Migrations ao projeto para criar as tabelas usadas pelo Identity no SQL Server.

Nota: O Migrations é uma forma de versionar o schema de sua aplicação. Ele trabalha na manipulação da base de dados: criando, alterando ou removendo, sendo, uma forma de controlar as alterações do seu banco juntamente com o versionamento de sua aplicação e compartilhar-la.

No Visual Studio, abra a janela do Package Manger Console e execute o seguinte comando:

Add-Migration AdicionarIdentity

Este comando vai criar o script de migração na pasta Migrations do projeto para criar as tabelas do Identity.

A seguir, não havendo erros, digite o comando:

Update-Database

Nota: Se você obter o erro 'The entity type 'IdentityUserLogin<string>' requires a primary key to be defined'
e estiver usando o método OnModelCreating na classe de contexto tente incluir
a chamada à classe base usando o código : base.OnModelCreating(modelBuilder);

Este comando vai aplicar o script criado e criar o banco de dados e as tabelas do Identity.

Podemos verificar isso abrindo o banco de dados no SQL Server Management Studio:

Podemos também consultar usando a opção Server Explorer no Visual Studio 2019 Community:

Assim já temos o Identity incluído em nosso projeto e as tabelas que ele usa já foram criadas.

No próximo artigo veremos como registrar um novo usuário usando o Identity.

"Sede, pois, imitadores de Deus, como filhos amados;
E andai em amor, como também Cristo vos amou, e se entregou a si mesmo por nós, em oferta e sacrifício a Deus, em cheiro suave."
Efésios 5:1,2

Referências:


José Carlos Macoratti