dotnet core 2.1 版本的 Identity 对 Views 做了层封装,默认 Template 创建出来的项目只有一个视图文件了。如果想自定义修改,还需要先把视图文件都创建出来才行。

默认的文件结构:identity-ui-files

使用 VS 添加

使用 VS 的话,还是很简单的,在项目上选择 Add,里面有 New Scaffolded Item 选项。一步步点下去就好了。

使用命令行添加

命令行比较麻烦,需要先安装生成工具,再进行生成,而且需要指定很多参数。

dotnet tool install -g dotnet-aspnet-codegenerator

dotnet add package Microsoft.VisualStudio.Web.CodeGeneration.Design
dotnet restore

# 查看生成的参数帮助
dotnet aspnet-codegenerator identity -h

dotnet aspnet-codegenerator identity -dc XXX.ApplicationDbContext --files "Account.Register;Account.Login;Account.Logout"

也要知道一下 AddDefaultIdentity 里封装的东西

public void ConfigureServices(IServiceCollection services)
{
// ...

services.AddIdentity<IdentityUser, IdentityRole>()
// services.AddDefaultIdentity<IdentityUser>()
.AddEntityFrameworkStores<ApplicationDbContext>();

services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1)
.AddRazorPagesOptions(options =>
{
options.AllowAreas = true;
options.Conventions.AuthorizeAreaFolder("Identity", "/Account/Manage");
options.Conventions.AuthorizeAreaPage("Identity", "/Account/Logout");
});

services.ConfigureApplicationCookie(options =>
{
options.LoginPath = $"/Identity/Account/Login";
options.LogoutPath = $"/Identity/Account/Logout";
options.AccessDeniedPath = $"/Identity/Account/AccessDenied";
});

// using Microsoft.AspNetCore.Identity.UI.Services;
services.AddSingleton<IEmailSender, EmailSender>();
}

可能遇到的问题

  1. 有可能遇到编译错误,找不到命名空间。
    是 Class Name 有冲突导致的,找到报错的文件,补上自己的命名空间就可以了。

  2. No IUserTwoFactorTokenProvider<TUser> named 'Default' is registered.
    是缺少 TokenProvider 导致的,在 service.AddIdentity 最后加上 .AddDefaultTokenProviders() 就可以了。
    里面还有很多可以配置的东西,可以参考:https://github.com/aspnet/Identity/issues/972

文档

  1. 更新详细的内容请参考(官方文档)offical doc