Migración de autenticación e Identity a ASP.NET Core

Por Steve Smith

En el artículo anterior, hemos migrado la configuración de un proyecto de MVC de ASP.NET a MVC ASP.NET Core. En este artículo, migramos las características de registro, inicio de sesión y administración de usuarios.

Configuración y pertenencia de Identity

En ASP.NET MVC, las características de autenticación e identidad se configuran mediante ASP.NET Identity en Startup.Auth.cs y IdentityConfig.cs, ubicados en la carpeta App_Start. En ASP.NET Core MVC, estas características se configuran en Startup.cs.

Instale los siguientes paquetes NuGet:

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

En Startup.cs, actualice el método Startup.ConfigureServices para usar Entity Framework y los servicios 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();
}

En este punto, hay dos tipos a los que se hace referencia en el código anterior que aún no hemos migrado desde el proyecto ASP.NET MVC: ApplicationDbContext y ApplicationUser. Cree una nueva carpeta Modelos en el proyecto de ASP.NET Core y agregue dos clases a ella correspondientes a estos tipos. Encontrará el ASP.NET versiones de MVC de estas clases en /Models/IdentityModels.cs, pero usaremos un archivo por clase en el proyecto migrado, ya que es más 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);
        }
    }
}

El ASP.NET Core proyecto web de inicio de MVC no incluye mucha personalización de usuarios ni ApplicationDbContext. Al migrar una aplicación real, también debes migrar todas las propiedades y métodos personalizados del usuario y las clases DbContext de la aplicación, así como cualquier otra clase Model que utilice la aplicación. Por ejemplo, si DbContext tiene DbSet<Album>,debe migrar la clase Album.

Con estos archivos en su lugar, el archivo Startup.cs se puede realizar para compilar mediante la actualización de sus instrucciones using:

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

Nuestra aplicación ya está lista para admitir la autenticación y los servicios Identity. Solo tiene que tener estas características expuestas a los usuarios.

Migración de la lógica de registro e inicio de sesión

Con los servicios Identity configurados para la aplicación y el acceso a datos configurados mediante Entity Framework y SQL Server, está todo listo para agregar compatibilidad con el registro e inicio de sesión en la aplicación. Recuerde que anteriormente en el proceso de migración hemos comentado una referencia a _LoginPartial en _Layout.cshtml. Ahora es el momento de volver a ese código, quitar la marca de comentario y agregar los controladores y vistas necesarios para admitir la funcionalidad de inicio de sesión.

Quite la marca de comentario de la línea @Html.Partial en _Layout.cshtml:

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

Ahora, agregue una nueva vista Razor denominada _LoginPartial a la carpeta Views/Shared:

Actualice _LoginPartial.cshtml con el código siguiente (reemplace todo su contenido):

@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>
}

En este momento, debería poder actualizar el sitio en el explorador.

Resumen

ASP.NET Core introduce cambios en las características Identity de ASP.NET. En este artículo, ha visto cómo migrar las características Identity de autenticación y administración de usuarios de ASP.NET a ASP.NET Core.