Migrowanie uwierzytelniania i Identity do ASP.NET Core

Autor: Steve Smith

W poprzednim artykule zmigrowaliśmy konfigurację z projektu MVC ASP.NET do ASP.NET Core MVC. W tym artykule migrujemy funkcje rejestracji, logowania i zarządzania użytkownikami.

Konfigurowanie Identity i członkostwo

W ASP.NET MVC funkcje uwierzytelniania i tożsamości są konfigurowane przy użyciu ASP.NET Identity w Startup.Auth.cs systemach i IdentityConfig.csznajdujących się w folderze App_Start . W usłudze ASP.NET Core MVC te funkcje są konfigurowane w programie Startup.cs.

Zainstaluj następujące pakiety NuGet:

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

W Startup.csprogramie zaktualizuj metodę Startup.ConfigureServices tak, aby korzystała z programu Entity Framework i Identity usług:

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();
}

W tym momencie istnieją dwa typy, do których odwołujemy się w powyższym kodzie, które nie zostały jeszcze zmigrowane z projektu ASP.NET MVC: ApplicationDbContext i ApplicationUser. Utwórz nowy folder Models w projekcie ASP.NET Core i dodaj do niego dwie klasy odpowiadające tym typom. Wersje MVC tych klas ASP.NET znajdują się w /Models/IdentityModels.cspliku , ale użyjemy jednego pliku na klasę w zmigrowanym projekcie, ponieważ jest to bardziej jasne.

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);
        }
    }
}

Projekt sieci Web ASP.NET Core MVC Starter nie obejmuje wielu dostosowań użytkowników ani .ApplicationDbContext Podczas migrowania rzeczywistej aplikacji należy również przeprowadzić migrację wszystkich właściwości niestandardowych i metod użytkowników i DbContext klas aplikacji, a także innych klas modelu używanych przez aplikację. Jeśli na przykład DbContext masz klasę DbSet<Album>, musisz przeprowadzić migrację Album klasy.

Po wprowadzeniu tych plików plik można skompilować, Startup.cs aktualizując jego using instrukcje:

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

Nasza aplikacja jest teraz gotowa do obsługi uwierzytelniania i Identity usług. Wystarczy, że te funkcje będą widoczne dla użytkowników.

Migrowanie logiki rejestracji i logowania

W przypadku Identity usług skonfigurowanych dla aplikacji i dostępu do danych skonfigurowanych przy użyciu programu Entity Framework i programu SQL Server możemy dodać obsługę rejestracji i logowania do aplikacji. Przypomnij sobie, że wcześniej w procesie migracji oznaczyliśmy odwołanie do _LoginPartial w pliku _Layout.cshtml. Teraz nadszedł czas, aby powrócić do tego kodu, usunąć komentarz i dodać niezbędne kontrolery i widoki do obsługi funkcji logowania.

Usuń komentarz z wiersza w pliku @Html.Partial_Layout.cshtml:

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

Teraz dodaj nowy Razor widok o nazwie _LoginPartial do folderu Views/Shared :

Zaktualizuj _LoginPartial.cshtml za pomocą następującego kodu (zastąp całą jego zawartość):

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

Na tym etapie powinno być możliwe odświeżenie witryny w przeglądarce.

Podsumowanie

ASP.NET Core wprowadza zmiany w funkcjach ASP.NET Identity . W tym artykule przedstawiono sposób migrowania funkcji uwierzytelniania i zarządzania użytkownikami ASP.NET Identity do ASP.NET Core.