Partilhar via


Migrar autenticação e Identity para o ASP.NET Core

Por Steve Smith

No artigo anterior, migramos a configuração de um projeto ASP.NET MVC para ASP.NET Core MVC. Neste artigo, migramos os recursos de registro, login e gerenciamento de usuários.

Configurar Identity e associação

No ASP.NET MVC, os recursos de autenticação e identidade são configurados usando ASP.NET Identity no Startup.Auth.cs e IdentityConfig.cs, localizado na pasta App_Start. No ASP.NET Core MVC, esses recursos são configurados em Startup.cs.

Instale os seguintes pacotes NuGet:

  • Microsoft.AspNetCore.Identity.EntityFrameworkCore
  • Microsoft.AspNetCore.Authentication.Cookies
  • Microsoft.EntityFrameworkCore.SqlServer

Advertência

Este artigo mostra o uso de cadeias de conexão. Com um banco de dados local, o usuário não precisa ser autenticado, mas na produção, as cadeias de conexão às vezes incluem uma senha para autenticar. Uma credencial de senha de proprietário de recurso (ROPC) é um risco de segurança que deve ser evitado em bancos de dados de produção. Os aplicativos de produção devem usar o fluxo de autenticação mais seguro disponível. Para obter mais informações sobre autenticação para aplicativos implantados em ambientes de teste ou produção, consulte Fluxos de autenticação segura.

No Startup.cs, atualize o método Startup.ConfigureServices para usar o Entity Framework e os serviços Identity.

public void ConfigureServices(IServiceCollection services)
{
    // Add EF services to the services container.
    services.AddDbContext<ApplicationDbContext>(options =>
        options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection")));

    services.AddIdentity<ApplicationUser, IdentityRole>()
        .AddEntityFrameworkStores<ApplicationDbContext>()
        .AddDefaultTokenProviders();

     services.AddMvc();
}

Neste ponto, há dois tipos referenciados no código acima que ainda não migramos do projeto ASP.NET MVC: ApplicationDbContext e ApplicationUser. Crie uma nova pasta Models no projeto ASP.NET Core e adicione duas classes correspondentes a esses tipos. Você encontrará as ASP.NET versões MVC dessas classes em /Models/IdentityModels.cs, mas usaremos um arquivo por classe no projeto migrado, pois isso é mais claro.

ApplicationUser.cs:

using Microsoft.AspNetCore.Identity.EntityFrameworkCore;

namespace NewMvcProject.Models
{
    public class ApplicationUser : IdentityUser
    {
    }
}

ApplicationDbContext.cs:

using Microsoft.AspNetCore.Identity.EntityFrameworkCore;
using Microsoft.Data.Entity;

namespace NewMvcProject.Models
{
    public class ApplicationDbContext : IdentityDbContext<ApplicationUser>
    {
        public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options)
            : base(options)
        {
        }

        protected override void OnModelCreating(ModelBuilder builder)
        {
            base.OnModelCreating(builder);
            // Customize the ASP.NET Core Identity model and override the defaults if needed.
            // For example, you can rename the ASP.NET Core Identity table names and more.
            // Add your customizations after calling base.OnModelCreating(builder);
        }
    }
}

O projeto ASP.NET Core MVC Starter Web não inclui muita personalização de usuários nem do elemento ApplicationDbContext. Ao migrar um aplicativo real, você também precisa migrar todas as propriedades e métodos personalizados das classes de usuário e DbContext do seu aplicativo, bem como quaisquer outras classes de modelo que seu aplicativo utilize. Por exemplo, se o seu DbContext tiver um DbSet<Album>, você precisará migrar a classe Album.

Com esses arquivos no lugar, o arquivo de Startup.cs pode ser compilado, atualizando as instruções using.

using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Identity;
using Microsoft.AspNetCore.Hosting;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;

A nossa aplicação está agora pronta para suportar serviços de autenticação e Identity. Ele só precisa ter esses recursos expostos aos usuários.

Migrar lógica de registro e login

Com Identity serviços configurados para o aplicativo e acesso a dados configurado usando o Entity Framework e o SQL Server, estamos prontos para adicionar suporte para registro e logon ao aplicativo. Lembre-se que no início do processo de migração comentamos uma referência a _LoginPartial em _Layout.cshtml. Agora é hora de retornar a esse código, descomentá-lo e adicionar os controladores e visualizações necessários para suportar a funcionalidade de login.

Descomente a linha @Html.Partial em _Layout.cshtml:

      <li>@Html.ActionLink("Contact", "Contact", "Home")</li>
    </ul>
    @*@Html.Partial("_LoginPartial")*@
  </div>
</div>

Agora, adicione uma nova exibição de Razor chamada _LoginPartial à pasta Views/Shared:

Atualize _LoginPartial.cshtml com o seguinte código (substitua todo o seu conteúdo):

@inject SignInManager<ApplicationUser> SignInManager
@inject UserManager<ApplicationUser> UserManager

@if (SignInManager.IsSignedIn(User))
{
    <form asp-area="" asp-controller="Account" asp-action="Logout" method="post" id="logoutForm" class="navbar-right">
        <ul class="nav navbar-nav navbar-right">
            <li>
                <a asp-area="" asp-controller="Manage" asp-action="Index" title="Manage">Hello @UserManager.GetUserName(User)!</a>
            </li>
            <li>
                <button type="submit" class="btn btn-link navbar-btn navbar-link">Log out</button>
            </li>
        </ul>
    </form>
}
else
{
    <ul class="nav navbar-nav navbar-right">
        <li><a asp-area="" asp-controller="Account" asp-action="Register">Register</a></li>
        <li><a asp-area="" asp-controller="Account" asp-action="Login">Log in</a></li>
    </ul>
}

Neste ponto, você deve ser capaz de atualizar o site em seu navegador.

Resumo

ASP.NET Core introduz alterações nos recursos ASP.NET Identity. Neste artigo, você viu como migrar os recursos de autenticação e gerenciamento de usuários do ASP.NET Identity para o ASP.NET Core.