Identity定义
ASP.NET Core Identity是用于构建ASP.NET Core Web应用程序的身份认证系统,包括用户数据,用户身份以及注册登录信息数据存储,可以让您的应用拥有登录功能以及持续化存储登录用户相关的数据。
- 一个API,支持用户界面UI登录功能
- 管理用户、密码、配置文件数据、角色、声明、令牌、电子邮件确认等
用户可使用存储在 Identity 中的登录信息创建帐户,或者可使用外部登录提供程序。支持的外部登录提供程序包括 Facebook、Google、Microsoft 帐户和 Twitter。
Identity 通常使用 SQL Server 数据库进行配置,以存储用户名、密码和配置文件数据。或者,可使用其他持久性存储,例如 Azure 表存储。
Identity应用步骤
- 通过模板创建项目 - ASP.NET Core Web应用(MVC),在其它信息页面,身份验证类型栏选择【个人账户】
- 生成的项目将 ASP.NET Core Identity作为Razor类库提供。IdentityRazor 类库公开具有 Identity 区域的终结点
- 创建数据库并迁移
- 修改数据库连接字符串
- 数据库更新迁移,在VS中打开视图-其它窗口-程序包管理器控制台,输入
Update-Database
,进行数据库迁移,再完成后打开数据库,会发现多出了几张表:- dbo._EFMigrationsHistory
- dbo.AspNetRoleClaims
- dbo.AspNetRoles
- dbo.AspNetUserClaims
- dbo.AspNetUserLogins
- dbo.AspNetUserRoles
- dbo.AspNetUsers
- dbo.AspNetUserTokens
- 配置Identity服务上述代码用默认选项值来配置 Identity,可通过依赖关系注入向应用提供服务。通过调用 UseAuthentication 启用 Identity, UseAuthentication 向请求管道添加身份验证中间件。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81// Program.cs
using DemoCoreIdentity.Data;
using Microsoft.AspNetCore.Identity;
using Microsoft.EntityFrameworkCore;
var builder = WebApplication.CreateBuilder(args);
// Add services to the container.
var connectionString = builder.Configuration.GetConnectionString("DefaultConnection");
builder.Services.AddDbContext<ApplicationDbContext>(options =>
options.UseSqlServer(connectionString));
builder.Services.AddDatabaseDeveloperPageExceptionFilter();
builder.Services.AddDefaultIdentity<IdentityUser>(options => options.SignIn.RequireConfirmedAccount = true)
.AddEntityFrameworkStores<ApplicationDbContext>();
builder.Services.AddControllersWithViews();
builder.Services.Configure<IdentityOptions>(options =>
{
// Password settings.
options.Password.RequireDigit = true;
options.Password.RequireLowercase = true;
options.Password.RequireNonAlphanumeric = true;
options.Password.RequireUppercase = true;
options.Password.RequiredLength = 6;
options.Password.RequiredUniqueChars = 1;
// Lockout settings.
options.Lockout.DefaultLockoutTimeSpan = TimeSpan.FromMinutes(5);
options.Lockout.MaxFailedAccessAttempts = 5;
options.Lockout.AllowedForNewUsers = true;
// User settings.
options.User.AllowedUserNameCharacters =
"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-._@+";
options.User.RequireUniqueEmail = false;
});
builder.Services.ConfigureApplicationCookie(options =>
{
// Cookie settings
options.Cookie.HttpOnly = true;
options.ExpireTimeSpan = TimeSpan.FromMinutes(5);
options.LoginPath = "/Identity/Account/Login";
options.AccessDeniedPath = "/Identity/Account/AccessDenied";
options.SlidingExpiration = true;
});
var app = builder.Build();
// Configure the HTTP request pipeline.
if (app.Environment.IsDevelopment())
{
app.UseMigrationsEndPoint();
}
else
{
app.UseExceptionHandler("/Home/Error");
// The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();
app.UseAuthentication();
app.UseAuthorization();
app.MapControllerRoute(
name: "default",
pattern: "{controller=Home}/{action=Index}/{id?}");
app.MapRazorPages();
app.Run();
Identity测试
- 运行程序,默认打开Home/Index页面
- 注册用户,点击注册链接(右上角Register),打开注册窗口,输入用户名/密码,点击注册按钮即可(当注册校验不通过时,会有错误提示)
- 用户登录,点击登录链接(右上角Login),登录成功后会显示用户名
- 用户登出,点击登出链接(右上角Logout),会重新返回Home/Index页面并显示未登录状态
身份验证
通过模板创建的项目,默认情况下,Home/Index是没有身份验证的,可以在HomeController增加Authorize特性,增加身份验证,当添加成功后,再次打开首页时,会自动跳转到登录页面。
1 | // Controllers/HomeController.cs |
【注】:如果要对某一个Action增加验证,可以将Authorize特性添加在action上,进行更详细的身份验证。
添加基架项目
- 右键项目-添加-新搭建基架的项目
- 选择标识,点击添加
- 勾选替代所有文件,数据上下文类:ApplicationDbContext,选择添加
- 等待程序自动运行结束后,可以查看Account目录下多了很多文件,其中就包括Login.cshtml/Register.cshtml等
- 可以根据自己的需求修改定制开发身份验证类页面