快速掌握 ASP.NET 身份认证框架 Identity(一)

ASP.NET Core 内置了一个强大的身份认证框架 Identity,掌握它可以让我们快速开发高安全的身份认证功能,不仅如此,它还是一个基于数据库的用户管理系统,其中包含了大量的辅助功能,可以帮助我们完成对用户的管理。

它还可以与 IdentityServer 4 授权无缝集成,进一步开发出强大的认证授权系统。.

这个系列的目的,就是快速学习和上手 Identity ,让大家对其有一个系统的了解,内容较为精炼,不会有太多废话。

集成 Identity

在我们创建 ASP.NET Core 应用时,可以选择已经集成了 Identity 的项目模板。

不过,我们现在的目的是学习,所以我并不打算用项目模板来演示,而是从一个简单的 MVC 项目,从头开始集成 Identity。

示例项目:https://github.com/zilor-net/IdentitySample/tree/main/Sample01/Start

这个示例使用 EF Core 与数据库交互,启动项目时会自动迁移模型。

在 Home 控制器中,添加了一个 Employees 操作,用来从数据库中查询员工信息:

快速掌握 ASP.NET 身份认证框架 Identity(一)

集成 Identity

我们需要做的第一件事,就是安装 Identity EFCore 扩展库:

Install-Package Microsoft.AspNetCore.Identity.EntityFrameworkCore

这个库会帮助我们将 ASP.NET Core Identity,与现有的 EF Core 集成在一起。

安装完成后,在 「Models」 文件夹中,创建一个 「User」 实体类:

public class User : IdentityUser
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
}

这个类需要继承 ASP.NET Core Identity 提供的 IdentityUser 类。

IdentityUser 类中有很多关于用户信息的属性,这些属性在迁移时,都会参与到与 ASP.NET Core Identity 相关的表中。

因此,对于 「User」 类,我们只需要扩展 IdentityUser 类,添加一些自定义的用户属性就可以了,这些属性也都会添加到数据库中。

当然,如果你觉得 IdentityUser类中的属性,可以满足你的需求,那就不用创建额外的 「User」 类。

换句话说,只有在你需要对 IdentityUser 类进行扩展时,才需要创建自定义的 「User」 类。

现在,修改 「ApplicationContext」 类:

public class ApplicationContext : IdentityDbContext<User>
{
 // ...
    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        base.OnModelCreating(modelBuilder);

        modelBuilder.ApplyConfiguration(new EmployeeConfiguration());
    }
    //...
}

这里我们需要使用集成了 Identity 的 「DbContext」 类,而不是原始的 「DbContext」

还需要在 「OnModelCreating」 方法中,调用基类的 「OnModelCreating」 方法,因为它有一些与 Identity 实体相关的配置。

配置 Identity

我们可以在 「ConfigureServices」 方法中,注册 ASP.NET Core Identity 相关服务。

注册的扩展方法有两个:

builder.Services.AddIdentity<User, IdentityRole>()
    .AddEntityFrameworkStores<ApplicationContext>();

builder.Services.AddIdentityCore<User>()
    .AddEntityFrameworkStores<ApplicationContext>();

「AddIdentityCore」 方法,只会添加用户管理操作,如创建用户、散列密码、密码验证等,所需的服务。

「AddIdentity」 方法,不仅会添加用户管理服务,还会添加支持外部身份验证,以及角色管理相关的服务。

根据你的需要,可以使用不同的方法,注册不同的服务,这里我们使用 「AddIdentity」 方法。

还需要使用 「AddEntityFrameworkStores」 方法,注册与 Identity 数据存储相关的 EF Core 实现。

现在,我们需要创建一个新的迁移,在数据库中添加 Identity 相关的表:

Add-Migration IdentityScheme
Update-Database

更新完成后,打开数据库,可以看到多了很多 ASPNET 前缀的表。

展开 「AspNetUsers」 表的列,我们可以找到刚才 「User」 类中,自定义的两个属性:

快速掌握 ASP.NET 身份认证框架 Identity(一)

不过需要注意的是,由于我们采用的是基于角色的用户管理,而现在这个数据库中,没有任何角色信息。

所以,我们需要创建一些初始数据。

在数据库中设置初始角色,是一个非常常见的操作,在 「Models\Configuration」 文件夹中,创建一个 「IdentityRole」 实体配置类:

public class RoleConfiguration : IEntityTypeConfiguration<IdentityRole>
{
    public void Configure(EntityTypeBuilder<IdentityRole> builder)
    {
        builder.HasData(
            new IdentityRole
            {
                Name = "Guest",
                NormalizedName = "GUEST"
            },
            new IdentityRole
            {
                Name = "Administrator",
                NormalizedName = "ADMINISTRATOR"
            });
    }
}

这里有两个初始角色数据,然后在上下文中应用这个配置:

modelBuilder.ApplyConfiguration(new RoleConfiguration());

最后,让我们再次创建并应用迁移:

Add-Migration InsertedRoles
Update-Database

查看数据库中的 「AspNetRoles」 表,可以看到这里已经有了两条角色数据。

目前为止,我们已经在项目中,初步集成了 ASP.NET Core Identity 框架,可以看到,这一点不复杂,而且非常简单。

小结

这篇文章简单的介绍了 Identity 框架的集成,以及一些基础知识,下篇文章将会继续讲解用户的注册。