从零开始学ASP.NET Core Identity框架

我们经常使用的各类网站和App均会涉及注册、登录和修改密码等功能,登录系统后,有些功能会提示没有权限,甚至有些位置我们无法访问,这些都是系统权限和认证的体现 。
我们从本章及后面的章节中,将学习在ASP.NET Core应用程序中使用ASP.NET Core Identity实现安全认证相关功能所需要掌握的知识 。
本章主要向读者介绍如下内容 。

  • 什么是ASP.NET Core Identity 。
  • 如何在系统中启用Identity服务 。
  • UserManager与SignInManager的API介绍及使用 。
  • 登录用户的Cookie管理 。
21.1 ASP.NET Core Identity介绍ASP.NET Core Identity是一个会员身份系统,早期它的名字是Membership,当然那是一段“古老”的历史,现在我们来了解全新的Identity 。它允许我们创建、读取、更新和删除账户 。支持账号验证、身份验证、授权、恢复密码和SMS双因子身份验证 。它还支持微软、Facebook和google等第三方登录提供商 。它提供了一个丰富的API,并且这些API还可以进行大量的扩展 。我们将在本书的后面实现这些功能 。
添加ASP.NET Core Identity服务这里采用的是EF Core,因为要让我们的系统支持Identity服务,所以需要安装它的程序包 。打开NuGet管理器,安装Microsoft.AspNetCore.Identity.EntityFrameworkCore即可 。
以下是添加和配置ASP.NET Core Identity服务的步骤 。
使AppDbContext继承类IdentityDbContext,然后引入命名空间,代码如下 。
public class AppDbContext:IdentityDbContext{//其余代码}
  • 应用程序AppDbContextDbContext类必须继承IdentityDbContext类而不是DbContext类 。
  • 因为IdentityDbContext提供了管理SQL Server中的Identity表所需的所有DbSet属性,所以将看到ASP.NET Core Identity框架中要生成的所有数据库表 。
  • 如果浏览IdentityDbContext类的定义(按F12键可以看到),则将看到它继承自DbContext类 。因此,如果类继承自IdentityDbContext类,那么不必显式继承DbContext类 。
配置ASP.NET Core Identity服务 。在Startup类的ConfigureServices()方法中,添加以下代码行 。
services.AddIdentity<IdentityUser,IdentityRole>().AddEntityFrameworkStores<AppDbContext>();
  • AddIdentity()方法是指为系统提供默认的用户和角色类型的身份验证系统 。
  • IdentityUser类由ASP.NET Core提供,包含UserName、PasswordHash和Email等属性 。这是ASP.NET Core Identity框架默认使用的类,用于管理应用程序的注册用户 。
  • 如果读者希望存储有关注册用户的其他信息,比如性别、城市等,则需要创建一个派生自IdentityUser的自定义类 。在此自定义类中添加所需的其他属性,然后插入此类而不是内置的IdentityUser类 。我们将在后面的章节中学习如何执行此操作 。
  • 同样,IdentityRole也是ASP.NET Core Identity提供的内置类,包含角色信息 。
  • 使用EntityFrameWork Core从基础SQL Server数据库存储和查询注册用户的角色信息 。
  • 使用AddEntityFrameworkStores()方法,然后指定DbContext类作为泛型参数 。
接下来,将Authentication()中间件添加到请求管道,代码如下 。
public void Configure(IApplicationBuilder app,IWebHostEnvironment env){//如果环境是Development serve Developer Exception Pageif(env.IsDevelopment()){app.UseDeveloperExceptionPage();}//否则显示用户友好的错误页面else if(env.IsStaging() || env.IsProduction() || env.IsEnvironment("UAT")){app.UseExceptionHandler("/Error");app.UseStatusCodePagesWithReExecute("/Error/{0}");}//使用纯静态文件支持的中间件,而不使用带有终端的中间件app.UseStaticFiles();//添加验证中间件app.UseAuthentication();app.UseRouting();app.UseEndpoints(endpoints =>{endpoints.MapControllerRoute(name:"default",pattern:"{controller=Home}/{action=Index}/{id?}");});}在Startup类的Configure()方法中,调用UseAuthentication()方法将Authentication()中间件添加到应用程序的请求处理管道中 。我们希望能够在请求到达MVC中间件之前对用户进行身份验证 。因此,在请求处理管道的UseRouting()中间件之前添加认证中间件 。这很重要,因为我们之前讲过中间件的添加顺序不能乱 。
现在开始添加身份迁移 。在Visual Studio中的程序包控制台窗口执行以下命令以添加新迁移 。
Add-Migration AddingIdentity此迁移包含用于创建ASP.NET Core Identity系统所需的表的代码 。
如果运行,则会出现以下错误 。
The entity type'IdentityUserLogin'requires a primary key to be defined.
之前因为要封装Seed()方法,所以重写OnModelCreating()方法 。出现这个错误是因为我们在DbContext类中重写了OnModelCreating()方法,但未调用基本IdentityDbContext类OnModelCreating()方法 。


推荐阅读