推荐关注「码侠江湖」加星标,时刻不忘江湖事
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
操作,用来从数据库中查询员工信息:
集成 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」 类中,自定义的两个属性:
不过需要注意的是,由于我们采用的是基于角色的用户管理,而现在这个数据库中,没有任何角色信息。
所以,我们需要创建一些初始数据。
在数据库中设置初始角色,是一个非常常见的操作,在 「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 框架的集成,以及一些基础知识,下篇文章将会继续讲解用户的注册。
更多精彩内容,请关注我▼▼
如果喜欢我的文章,那么
在看和转发是对我最大的支持!
(戳下面蓝字阅读)
ASP.NET 6 中间件系列
查缺补漏系统学习 EF Core 6 系列
推荐关注微信公众号:码侠江湖
觉得不错,点个在看再走哟