1. Introduction to Identity
dotnet new webapp --auth Individual -uld -o WebApp1
new webapp 是做一个 razor page
--auth Individual 就是表示要包含 identity
-uld 是 use local database (本地数据库, 默认是用 SQLite)
-o WebApp1 是 output 项目名字
运行上面 command 后, 所有代码就写好了. 它是搭配 ef core 的哦. 接下来就是通过 ef migration 创建数据库了
dotnet ef database update
接着在 private 页面放上 authorize 标签就可以跑了
有一个小 point 要记入, app.UseAuthentication 的位置蛮重要的,
2. Scaffold Identity
之所以几行 command 就可以跑是因为微软对 identity 做了一个封装, 这个封装还包括了 view (这个技术叫 Razor Class Library 简称 RCL)
我们来从一个 webapp 没有 authentication 的做起.
先装好 global 工具
dotnet tool install -g dotnet-aspnet-codegenerator
// 做一个新项目, 没有 authentication 的
dotnet new webapp -o ScaffoldIdentity
// 进入项目 folder
cd ScaffoldIdentity
// 装 package
dotnet add package Microsoft.VisualStudio.Web.CodeGeneration.Design
dotnet add package Microsoft.EntityFrameworkCore.Design
dotnet add package Microsoft.AspNetCore.Identity.EntityFrameworkCore
dotnet add package Microsoft.AspNetCore.Identity.UI
dotnet add package Microsoft.EntityFrameworkCore.SqlServer
dotnet add package Microsoft.EntityFrameworkCore.Tools
// generate identity code template
dotnet aspnet-codegenerator identity --useDefaultUI
// 做数据库
dotnet ef migrations add CreateIdentitySchema
dotnet ef database update
跑完上面的 command 后, 在 startup 添加 UseAuthentication
然后在 layout view 添加, 就可以了
当然这个只是演示让我们知道它是怎样 work 起来的, 真实开发还是差很多的. 之后慢慢讲.
这里有几个 point 可以记入一下.
有一个 file IdentityHostingStartup.cs, 里面封装了 service 的调用, 所以我们在 startup 看不到,
然后所有的 view 都是看不见 source code 的.
除非在我们声明时加入 --files 或者拿掉 --useDefaultUI 那么所有的 source code 才会显示出来 (这正是我们需要的, 不然怎么魔改呢 ?)
3. Identity Overview
既然 Scaffold 帮我们搞了这么多代码, 那我们一个一个来看看 identity 框架的代码时如何工作得。要魔改自然要先摸清楚咯.
首先是 database entity
public class ScaffoldIdentityIdentityDbContext : IdentityDbContext<IdentityUser>
{
public ScaffoldIdentityIdentityDbContext(DbContextOptions<ScaffoldIdentityIdentityDbContext> options)
: base(options)
{
}
protected override void OnModelCreating(ModelBuilder builder)
{
base.OnModelCreating(builder);
}
}
可以看到就是把平常得 DbContext 继承了 IdentityDbContext
Identity 封装了许多得 model, 比如 IdentityUser, IdentityRole 等等啦.
有了这些, 数据库就搞定了.
接下来就是 Startup 的 service provide
services.AddDefaultIdentity<IdentityUser>(options => options.SignIn.RequireConfirmedAccount = true)
.AddEntityFrameworkStores<ScaffoldIdentityIdentityDbContext>();
完整源码去这里下载 https://github.com/dotnet/aspnetcore/tree/main/src/Identity
2 年前我超讨厌看 .net 源码的, 东一个西一个, 幸好现在全部放一起了.
这里的源码需要稍微看一下,因为大部分情况我们是需要修改的.
AddDefaultIdentity
services.AddAuthentication 是 asp.net core authentication 的 service 来的哦
AddIdentityCookies
里面负责了 cookie schemes 的代码
负责UserManger 之类的
AddDefaultUI
https://github.com/dotnet/aspnetcore/blob/main/src/Identity/UI/src/IdentityBuilderUIExtensions.cs
负责 Ui 的咚咚, SignInManager 也在这里哦
AddDefaultTokenProviders
https://github.com/dotnet/aspnetcore/blob/main/src/Identity/Core/src/IdentityBuilderExtensions.cs
Email, Phone reset password 这些 token 的做法
还有一个叫 AddIdentity 的
这个是以前还没有 Default UI 的时候的, 简单说就是你要什么就拿什么来用,拿什么来改就是了. 最重要的是全部过一遍知道它都搞了些啥.