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


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 terceira parte do artigo veremos como tratar o POST do formulário de registro e como armazenar as informações no banco de dados.

Para poder receber as informações do registro do usuário teremos que implementar as seguintes funcionalidades no controlador AccountController:

  1. Criar o método Action Register HttpPost que vai tratar o POST das informações feitas no formulário de registro;
  2. Usar o serviço UserManager<IdentityUser> para criar um novo usuário;
  3. Usar o serviço SignInManager<IdentityUser> para fazer o login do usuário criado;

Para isso vamos incluir o código a seguir no controlador AccountController:

using FuncionariosWeb.ViewModels;
using Microsoft.AspNetCore.Identity;
using Microsoft.AspNetCore.Mvc;
using System.Threading.Tasks;
namespace FuncionariosWeb.Controllers
{
    public class AccountController : Controller
    {
        private readonly UserManager<IdentityUser> userManager;
        private readonly SignInManager<IdentityUser> signInManager;
        public AccountController(UserManager<IdentityUser> userManager,
            SignInManager<IdentityUser> signInManager)
        {
            this.userManager = userManager;
            this.signInManager = signInManager;
        }
        [HttpGet]
        public IActionResult Register()
        {
            return View();
        }
        [HttpPost]
        public async Task<IActionResult> Register(RegisterViewModel model)
        {
            if (ModelState.IsValid)
            {
                // Copia os dados do RegisterViewModel para o IdentityUser
                var user = new IdentityUser
                {
                    UserName = model.Email,
                    Email = model.Email
                };
                // 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)
                {
                    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);
        }
    }
}

Vamos entender o código:

A classe UserManager<IdentityUser> contém os métodos necessários para gerenciar usuários no armazenamento de dados. Por exemplo, esta classe possui métodos como CreateAsync, DeleteAsync, UpdateAsync para criar, excluir e atualizar usuários.

A classe SignInManager<IdentityUser> contém os métodos necessários para o login dos usuários. Por exemplo, essa classe possui métodos como SignInAsync, SignOutAsync para entrada e saida do usuário.

Os serviços UserManager e SignInManager são injetados no construtor da classe AccountController usando injeção de construtor, e, ambos os serviços aceitam um parâmetro genérico. Usamos o parâmetro genérico para especificar a classe User com a qual esses serviços devem trabalhar.

No momento, estamos usando a classe IdentityUser interna como argumento para o parâmetro genérico. O parâmetro genérico nesses 2 serviços é um ponto de extensão.

Isso significa que podemos criar nosso próprio usuário personalizado com quaisquer dados adicionais que desejamos capturar sobre o usuário e, em seguida, conectar essa classe personalizada como um argumento para o parâmetro genérico em vez da classe IdentityUser interna.

Neste momento podemos executar o projeto e fazer o registro de um usuário. Os dados serão armazenados na tabela AspNetUsers no SQL Server.

Executando o projeto iremos obter:



Para confirmar que os dados foram gravados na tabela AspNetUsers podemos verificar os dados no SQL Server Management Studio ou no Visual Studio 2019 usando o Server Explorer:

No próximo artigo veremos como tratar com a complexidade das senhas que podemos usar com o Identity.

"E Jesus lhe disse: Ninguém, que lança mão do arado e olha para trás, é apto para o reino de Deus."
Lucas 9:62

Referências:


José Carlos Macoratti