将身份验证和 Identity 迁移至 ASP.NET Core

作者:Steve Smith

在上一篇文章中,我们已 将配置从 ASP.NET MVC 项目迁移到 ASP.NET Core MVC。 在本文中,我们将迁移注册、登录和用户管理功能。

配置 Identity 和成员身份

在 ASP.NET MVC 中,通过 ASP.NET 中的Identity在Startup.Auth.csIdentityConfig.cs中配置身份验证和标识功能,这些文件位于App_Start文件夹中。 在 ASP.NET Core MVC 中,这些功能在 Startup.cs.

安装以下 NuGet 包:

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

警告

本文介绍连接字符串的使用。 使用本地数据库时,用户无需进行身份验证,但在生产环境中,连接字符串有时包括进行身份验证的密码。 资源所有者密码凭据(ROPC)是在生产数据库中应避免的安全风险。 生产应用应使用可用的最安全的身份验证流。 有关部署到测试或生产环境的应用的身份验证的详细信息,请参阅 安全身份验证流

Startup.cs中,更新Startup.ConfigureServices方法以便使用 Entity Framework 和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();
}

此时,上述代码中引用了两种类型,这些类型尚未从 ASP.NET MVC 项目迁移: ApplicationDbContextApplicationUser。 在 ASP.NET Core 项目中创建新的 Models 文件夹,并向其添加两个对应于这些类型的类。 你可以在其中找到这些类 /Models/IdentityModels.cs的 ASP.NET MVC 版本,但我们会在迁移的项目中为每个类使用一个文件,因为这样更清楚。

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

ASP.NET Core MVC 初学者 Web 项目没有包含太多用户自定义功能或 ApplicationDbContext。 迁移真实应用时,还需要迁移应用中用户和DbContext类的所有自定义属性和方法,以及应用使用的任何其他模型类。 例如,如果您的DbContext具有DbSet<Album>,您需要迁移Album类。

有了这些文件,通过更新 using 语句可以使 Startup.cs 文件被编译。

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

我们的应用现已准备好支持身份验证和服务 Identity 。 它只需要向用户公开这些功能。

迁移注册和登录逻辑

使用 Identity Entity Framework 和 SQL Server 配置了应用和数据访问的服务后,我们便可以添加对注册和登录应用的支持。

取消注释以下 @Html.Partial_Layout.cshtml

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

现在,将名为Razor的新视图添加到 Views/Shared 文件夹:

使用以下代码进行更新 _LoginPartial.cshtml (替换其所有内容):

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

此时,你应该能够在浏览器中刷新站点。

概要

ASP.NET Core 引入了对 ASP.NET Identity 功能的更改。 本文介绍了如何将 ASP.NET Identity 的身份验证和用户管理功能迁移到 ASP.NET Core。