ASP.NET Core 项目中的基架标识Scaffold Identity in ASP.NET Core projects

本文内容

作者:Rick Anderson

ASP.NET Core 提供作为Razor 类库ASP.NET Core 标识包含标识的应用程序可以应用 scaffolder 来有选择地添加标识 Razor 类库中包含的源代码(RCL)。建议生成源代码,以便修改代码和更改行为。例如,可以指示基架生成在注册过程中使用的代码。生成的代码优先于标识 RCL 中的相同代码。若要完全控制 UI,而不使用默认的 RCL,请参阅创建完全标识 UI 源部分。

包含身份验证的应用程序可以应用 scaffolder 来添加 RCL 标识包。可以选择要生成的标识代码。

尽管 scaffolder 生成了大部分必要的代码,但你需要更新项目以完成该过程。本文档介绍完成标识基架更新所需的步骤。

建议使用显示文件差异的源代码管理系统,并使您能够回退更改。运行标识 scaffolder 后检查更改。

使用双重身份验证帐户确认和密码恢复,以及使用标识的其他安全功能时,需要提供服务。基架标识时不生成服务或服务存根。要启用这些功能,必须手动添加服务。例如,请参阅需要确认电子邮件

本文档包含的详细说明比在运行 scaffolder 时生成的ScaffoldingReadme文件更完整。

将标识基架到空项目中Scaffold identity into an empty project

运行标识 scaffolder:

  • 解决方案资源管理器中,右键单击项目 >添加 > 新的基架项
  • 在 "添加基架" 对话框的左窗格中,选择 "标识" > "添加"。
  • 在 "添加标识" 对话框中,选择所需的选项。
    • 选择现有的布局页,否则将用错误的标记覆盖你的布局文件。例如 ~/Pages/Shared/_Layout.cshtml Razor Pages MVC 项目的 ~/Views/Shared/_Layout.cshtml
    • 选择 " + " 按钮以创建新的数据上下文类
  • 选择 "添加"。

如果以前未安装 ASP.NET Core 基架,请立即进行安装:

  1. dotnet tool install -g dotnet-aspnet-codegenerator

将所需的 NuGet 包引用添加到项目(*.csproj)文件中。在项目目录中运行以下命令:

  1. dotnet add package Microsoft.VisualStudio.Web.CodeGeneration.Design
  2. dotnet add package Microsoft.EntityFrameworkCore.Design
  3. dotnet add package Microsoft.AspNetCore.Identity.EntityFrameworkCore
  4. dotnet add package Microsoft.AspNetCore.Identity.UI
  5. dotnet add package Microsoft.EntityFrameworkCore.SqlServer
  6. dotnet add package Microsoft.EntityFrameworkCore.Tools

运行以下命令以列出标识基架选项:

  1. dotnet aspnet-codegenerator identity -h

如果出现基架错误,请验证目标框架名字对象 (TFM) 是否与项目文件中的 NuGet 包版本相匹配。例如,以下项目文件包含适用于 .NET Core 的版本 3.1 和所列的 NuGet 包:

  1. <Project Sdk="Microsoft.NET.Sdk.Web">
  2. <PropertyGroup>
  3. <TargetFramework>netcoreapp3.1</TargetFramework>
  4. </PropertyGroup>
  5. <ItemGroup>
  6. <PackageReference Include="Microsoft.AspNetCore.Diagnostics.EntityFrameworkCore" Version="3.1.0" />
  7. <PackageReference Include="Microsoft.AspNetCore.Identity.EntityFrameworkCore" Version="3.1.0" />
  8. <PackageReference Include="Microsoft.AspNetCore.Identity.UI" Version="3.1.0" />
  9. <PackageReference Include="Microsoft.EntityFrameworkCore.Design" Version="3.1.0" />
  10. <PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer" Version="3.1.0" />
  11. <PackageReference Include="Microsoft.EntityFrameworkCore.Tools" Version="3.1.0" />
  12. <PackageReference Include="Microsoft.VisualStudio.Web.CodeGeneration.Design" Version="3.1.0" />
  13. </ItemGroup>
  14. </Project>

在项目文件夹中,运行具有所需选项的标识 scaffolder。例如,若要设置默认 UI 和最小文件数的标识,请运行以下命令:

  1. dotnet aspnet-codegenerator identity --useDefaultUI

用类似于下面的代码更新 Startup 类:

  1. public class Startup
  2. {
  3. public Startup(IConfiguration configuration)
  4. {
  5. Configuration = configuration;
  6. }
  7. public IConfiguration Configuration { get; }
  8. public void ConfigureServices(IServiceCollection services)
  9. {
  10. services.AddDbContext<ApplicationDbContext>(options =>
  11. options.UseSqlServer(
  12. Configuration.GetConnectionString("DefaultConnection")));
  13. services.AddDefaultIdentity<IdentityUser>(options => options.SignIn.RequireConfirmedAccount = true)
  14. .AddEntityFrameworkStores<ApplicationDbContext>();
  15. services.AddControllersWithViews();
  16. services.AddRazorPages();
  17. }
  18. public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
  19. {
  20. if (env.IsDevelopment())
  21. {
  22. app.UseDeveloperExceptionPage();
  23. app.UseDatabaseErrorPage();
  24. }
  25. else
  26. {
  27. app.UseExceptionHandler("/Home/Error");
  28. app.UseHsts();
  29. }
  30. app.UseHttpsRedirection();
  31. app.UseStaticFiles();
  32. app.UseRouting();
  33. app.UseAuthentication();
  34. app.UseAuthorization();
  35. app.UseEndpoints(endpoints =>
  36. {
  37. endpoints.MapControllerRoute(
  38. name: "default",
  39. pattern: "{controller=Home}/{action=Index}/{id?}");
  40. endpoints.MapRazorPages();
  41. });
  42. }
  43. }

建议 UseHsts,但不是必需的。有关详细信息,请参阅HTTP 严格传输安全协议

生成的标识数据库代码需要Entity Framework Core 迁移创建迁移并更新数据库。例如,运行以下命令:

在 Visual Studio包管理器控制台中:

  1. Install-Package Microsoft.AspNetCore.Diagnostics.EntityFrameworkCore
  2. Add-Migration CreateIdentitySchema
  3. Update-Database
  1. dotnet ef migrations add CreateIdentitySchema
  2. dotnet ef database update

Add-Migration 命令的 "CreateIdentitySchema" name 参数是任意的。"CreateIdentitySchema" 介绍迁移。

将标识基架到 Razor 项目,而无需现有授权Scaffold identity into a Razor project without existing authorization

运行标识 scaffolder:

  • 解决方案资源管理器中,右键单击项目 >添加 > 新的基架项
  • 在 "添加基架" 对话框的左窗格中,选择 "标识" > "添加"。
  • 在 "添加标识" 对话框中,选择所需的选项。
    • 选择现有的布局页,否则将用错误的标记覆盖你的布局文件。例如 ~/Pages/Shared/_Layout.cshtml Razor Pages MVC 项目的 ~/Views/Shared/_Layout.cshtml
    • 选择 " + " 按钮以创建新的数据上下文类
  • 选择 "添加"。

如果以前未安装 ASP.NET Core 基架,请立即进行安装:

  1. dotnet tool install -g dotnet-aspnet-codegenerator

将所需的 NuGet 包引用添加到项目(*.csproj)文件中。在项目目录中运行以下命令:

  1. dotnet add package Microsoft.VisualStudio.Web.CodeGeneration.Design
  2. dotnet add package Microsoft.EntityFrameworkCore.Design
  3. dotnet add package Microsoft.AspNetCore.Identity.EntityFrameworkCore
  4. dotnet add package Microsoft.AspNetCore.Identity.UI
  5. dotnet add package Microsoft.EntityFrameworkCore.SqlServer
  6. dotnet add package Microsoft.EntityFrameworkCore.Tools

运行以下命令以列出标识基架选项:

  1. dotnet aspnet-codegenerator identity -h

如果出现基架错误,请验证目标框架名字对象 (TFM) 是否与项目文件中的 NuGet 包版本相匹配。例如,以下项目文件包含适用于 .NET Core 的版本 3.1 和所列的 NuGet 包:

  1. <Project Sdk="Microsoft.NET.Sdk.Web">
  2. <PropertyGroup>
  3. <TargetFramework>netcoreapp3.1</TargetFramework>
  4. </PropertyGroup>
  5. <ItemGroup>
  6. <PackageReference Include="Microsoft.AspNetCore.Diagnostics.EntityFrameworkCore" Version="3.1.0" />
  7. <PackageReference Include="Microsoft.AspNetCore.Identity.EntityFrameworkCore" Version="3.1.0" />
  8. <PackageReference Include="Microsoft.AspNetCore.Identity.UI" Version="3.1.0" />
  9. <PackageReference Include="Microsoft.EntityFrameworkCore.Design" Version="3.1.0" />
  10. <PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer" Version="3.1.0" />
  11. <PackageReference Include="Microsoft.EntityFrameworkCore.Tools" Version="3.1.0" />
  12. <PackageReference Include="Microsoft.VisualStudio.Web.CodeGeneration.Design" Version="3.1.0" />
  13. </ItemGroup>
  14. </Project>

在项目文件夹中,运行具有所需选项的标识 scaffolder。例如,若要设置默认 UI 和最小文件数的标识,请运行以下命令:

  1. dotnet aspnet-codegenerator identity --useDefaultUI

区域/标识/IdentityHostingStartup中配置标识。有关详细信息,请参阅IHostingStartup

迁移、UseAuthentication 和布局Migrations, UseAuthentication, and layout

生成的标识数据库代码需要Entity Framework Core 迁移创建迁移并更新数据库。例如,运行以下命令:

在 Visual Studio包管理器控制台中:

  1. Install-Package Microsoft.AspNetCore.Diagnostics.EntityFrameworkCore
  2. Add-Migration CreateIdentitySchema
  3. Update-Database
  1. dotnet ef migrations add CreateIdentitySchema
  2. dotnet ef database update

Add-Migration 命令的 "CreateIdentitySchema" name 参数是任意的。"CreateIdentitySchema" 介绍迁移。

启用身份验证Enable authentication

用类似于下面的代码更新 Startup 类:

  1. public class Startup
  2. {
  3. public Startup(IConfiguration configuration)
  4. {
  5. Configuration = configuration;
  6. }
  7. public IConfiguration Configuration { get; }
  8. public void ConfigureServices(IServiceCollection services)
  9. {
  10. services.AddDbContext<ApplicationDbContext>(options =>
  11. options.UseSqlServer(
  12. Configuration.GetConnectionString("DefaultConnection")));
  13. services.AddDefaultIdentity<IdentityUser>(options =>
  14. options.SignIn.RequireConfirmedAccount = true)
  15. .AddEntityFrameworkStores<ApplicationDbContext>();
  16. services.AddRazorPages();
  17. }
  18. public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
  19. {
  20. if (env.IsDevelopment())
  21. {
  22. app.UseDeveloperExceptionPage();
  23. app.UseDatabaseErrorPage();
  24. }
  25. else
  26. {
  27. app.UseExceptionHandler("/Error");
  28. app.UseHsts();
  29. }
  30. app.UseHttpsRedirection();
  31. app.UseStaticFiles();
  32. app.UseRouting();
  33. app.UseAuthentication();
  34. app.UseAuthorization();
  35. app.UseEndpoints(endpoints =>
  36. {
  37. endpoints.MapRazorPages();
  38. });
  39. }
  40. }

建议 UseHsts,但不是必需的。有关详细信息,请参阅HTTP 严格传输安全协议

布局更改Layout changes

可选:将登录名部分(_LoginPartial)添加到布局文件中:

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="utf-8" />
  5. <meta name="viewport" content="width=device-width, initial-scale=1.0" />
  6. <title>@ViewData["Title"] - WebRP</title>
  7. <link rel="stylesheet" href="~/lib/bootstrap/dist/css/bootstrap.min.css" />
  8. <link rel="stylesheet" href="~/css/site.css" />
  9. </head>
  10. <body>
  11. <header>
  12. <nav class="navbar navbar-expand-sm navbar-toggleable-sm navbar-light bg-white border-bottom box-shadow mb-3">
  13. <div class="container">
  14. <a class="navbar-brand" asp-area="" asp-page="/Index">WebRP</a>
  15. <button class="navbar-toggler" type="button" data-toggle="collapse" data-target=".navbar-collapse" aria-controls="navbarSupportedContent"
  16. aria-expanded="false" aria-label="Toggle navigation">
  17. <span class="navbar-toggler-icon"></span>
  18. </button>
  19. <div class="navbar-collapse collapse d-sm-inline-flex flex-sm-row-reverse">
  20. <partial name="_LoginPartial" />
  21. <ul class="navbar-nav flex-grow-1">
  22. <li class="nav-item">
  23. <a class="nav-link text-dark" asp-area="" asp-page="/Index">Home</a>
  24. </li>
  25. <li class="nav-item">
  26. <a class="nav-link text-dark" asp-area="" asp-page="/Privacy">Privacy</a>
  27. </li>
  28. </ul>
  29. </div>
  30. </div>
  31. </nav>
  32. </header>
  33. <div class="container">
  34. <main role="main" class="pb-3">
  35. @RenderBody()
  36. </main>
  37. </div>
  38. <footer class="border-top footer text-muted">
  39. <div class="container">
  40. &copy; 2019 - WebRP - <a asp-area="" asp-page="/Privacy">Privacy</a>
  41. </div>
  42. </footer>
  43. <script src="~/lib/jquery/dist/jquery.min.js"></script>
  44. <script src="~/lib/bootstrap/dist/js/bootstrap.bundle.min.js"></script>
  45. <script src="~/js/site.js" asp-append-version="true"></script>
  46. @RenderSection("Scripts", required: false)
  47. </body>
  48. </html>

使用授权将标识基架到 Razor 项目Scaffold identity into a Razor project with authorization

运行标识 scaffolder:

  • 解决方案资源管理器中,右键单击项目 >添加> 新的基架项
  • 在 "添加基架" 对话框的左窗格中,选择 "标识" > "添加"。
  • 在 "添加标识" 对话框中,选择所需的选项。
    • 选择现有的布局页,否则将用错误的标记覆盖你的布局文件。选择现有 _布局 cshtml文件时,会覆盖它。

例如: MVC 项目的 Razor Pages ~/Views/Shared/_Layout.cshtml~/Pages/Shared/_Layout.cshtml

  • 若要使用现有的数据上下文,请至少选择一个要重写的文件。必须至少选择一个文件以添加数据上下文。
    • 选择数据上下文类。
    • 选择 添加
  • 创建新的用户上下文,并可能为标识创建自定义用户类:
    • 选择 " + " 按钮以创建新的数据上下文类
    • 选择 添加

注意:如果要创建新的用户上下文,则无需选择要重写的文件。

如果以前未安装 ASP.NET Core 基架,请立即进行安装:

  1. dotnet tool install -g dotnet-aspnet-codegenerator

将所需的 NuGet 包引用添加到项目(*.csproj)文件中。在项目目录中运行以下命令:

  1. dotnet add package Microsoft.VisualStudio.Web.CodeGeneration.Design
  2. dotnet add package Microsoft.EntityFrameworkCore.Design
  3. dotnet add package Microsoft.AspNetCore.Identity.EntityFrameworkCore
  4. dotnet add package Microsoft.AspNetCore.Identity.UI
  5. dotnet add package Microsoft.EntityFrameworkCore.SqlServer
  6. dotnet add package Microsoft.EntityFrameworkCore.Tools

运行以下命令以列出标识基架选项:

  1. dotnet aspnet-codegenerator identity -h

如果出现基架错误,请验证目标框架名字对象 (TFM) 是否与项目文件中的 NuGet 包版本相匹配。例如,以下项目文件包含适用于 .NET Core 的版本 3.1 和所列的 NuGet 包:

  1. <Project Sdk="Microsoft.NET.Sdk.Web">
  2. <PropertyGroup>
  3. <TargetFramework>netcoreapp3.1</TargetFramework>
  4. </PropertyGroup>
  5. <ItemGroup>
  6. <PackageReference Include="Microsoft.AspNetCore.Diagnostics.EntityFrameworkCore" Version="3.1.0" />
  7. <PackageReference Include="Microsoft.AspNetCore.Identity.EntityFrameworkCore" Version="3.1.0" />
  8. <PackageReference Include="Microsoft.AspNetCore.Identity.UI" Version="3.1.0" />
  9. <PackageReference Include="Microsoft.EntityFrameworkCore.Design" Version="3.1.0" />
  10. <PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer" Version="3.1.0" />
  11. <PackageReference Include="Microsoft.EntityFrameworkCore.Tools" Version="3.1.0" />
  12. <PackageReference Include="Microsoft.VisualStudio.Web.CodeGeneration.Design" Version="3.1.0" />
  13. </ItemGroup>
  14. </Project>

在项目文件夹中,运行具有所需选项的标识 scaffolder。例如,若要设置默认 UI 和最小文件数的标识,请运行以下命令。为数据库上下文使用正确的完全限定名:

  1. dotnet aspnet-codegenerator identity -dc MyWeb.Data.ApplicationDbContext --files "Account.Register;Account.Login"

PowerShell 使用分号作为命令分隔符。使用 PowerShell 时,请在文件列表中转义分号,或将文件列表置于双引号中。例如:

  1. dotnet aspnet-codegenerator identity -dc MyWeb.Data.ApplicationDbContext --files "Account.Register;Account.Login;Account.Logout"

如果在未指定 —files 标志或 —useDefaultUI 标志的情况下运行标识 scaffolder,则会在项目中创建所有可用的标识 UI 页。

运行标识 scaffolder:

  • 解决方案资源管理器中,右键单击项目 >添加> 新的基架项
  • 在 "添加基架" 对话框的左窗格中,选择 "标识" > "添加"。
  • 在 "添加标识" 对话框中,选择所需的选项。
    • 选择现有的布局页,否则将用错误的标记覆盖你的布局文件。选择现有 _布局 cshtml文件时,会覆盖它。

例如: MVC 项目的 Razor Pages ~/Views/Shared/_Layout.cshtml~/Pages/Shared/_Layout.cshtml

  • 若要使用现有的数据上下文,请至少选择一个要重写的文件。必须至少选择一个文件以添加数据上下文。
    • 选择数据上下文类。
    • 选择 添加
  • 创建新的用户上下文,并可能为标识创建自定义用户类:
    • 选择 " + " 按钮以创建新的数据上下文类
    • 选择 添加

注意:如果要创建新的用户上下文,则无需选择要重写的文件。

如果以前未安装 ASP.NET Core 基架,请立即进行安装:

  1. dotnet tool install -g dotnet-aspnet-codegenerator

将对VisualStudio的包引用添加到项目(*.csproj)文件中。在项目目录中运行以下命令:

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

运行以下命令以列出标识基架选项:

  1. dotnet aspnet-codegenerator identity -h

在项目文件夹中,运行具有所需选项的标识 scaffolder。例如,若要设置默认 UI 和最小文件数的标识,请运行以下命令。为数据库上下文使用正确的完全限定名:

  1. dotnet aspnet-codegenerator identity -dc MyWeb.Data.ApplicationDbContext --files "Account.Register;Account.Login"

PowerShell 使用分号作为命令分隔符。使用 PowerShell 时,请在文件列表中转义分号,或将文件列表置于双引号中。例如:

  1. dotnet aspnet-codegenerator identity -dc MyWeb.Data.ApplicationDbContext --files "Account.Register;Account.Login;Account.Logout"

如果在未指定 —files 标志或 —useDefaultUI 标志的情况下运行标识 scaffolder,则会在项目中创建所有可用的标识 UI 页。

某些标识选项在区域/标识/IdentityHostingStartup中配置。有关详细信息,请参阅IHostingStartup

不使用现有授权将标识基架到 MVC 项目Scaffold identity into an MVC project without existing authorization

运行标识 scaffolder:

  • 解决方案资源管理器中,右键单击项目 >添加 > 新的基架项
  • 在 "添加基架" 对话框的左窗格中,选择 "标识" > "添加"。
  • 在 "添加标识" 对话框中,选择所需的选项。
    • 选择现有的布局页,否则将用错误的标记覆盖你的布局文件。例如 ~/Pages/Shared/_Layout.cshtml Razor Pages MVC 项目的 ~/Views/Shared/_Layout.cshtml
    • 选择 " + " 按钮以创建新的数据上下文类
  • 选择 "添加"。

如果以前未安装 ASP.NET Core 基架,请立即进行安装:

  1. dotnet tool install -g dotnet-aspnet-codegenerator

将所需的 NuGet 包引用添加到项目(*.csproj)文件中。在项目目录中运行以下命令:

  1. dotnet add package Microsoft.VisualStudio.Web.CodeGeneration.Design
  2. dotnet add package Microsoft.EntityFrameworkCore.Design
  3. dotnet add package Microsoft.AspNetCore.Identity.EntityFrameworkCore
  4. dotnet add package Microsoft.AspNetCore.Identity.UI
  5. dotnet add package Microsoft.EntityFrameworkCore.SqlServer
  6. dotnet add package Microsoft.EntityFrameworkCore.Tools

运行以下命令以列出标识基架选项:

  1. dotnet aspnet-codegenerator identity -h

如果出现基架错误,请验证目标框架名字对象 (TFM) 是否与项目文件中的 NuGet 包版本相匹配。例如,以下项目文件包含适用于 .NET Core 的版本 3.1 和所列的 NuGet 包:

  1. <Project Sdk="Microsoft.NET.Sdk.Web">
  2. <PropertyGroup>
  3. <TargetFramework>netcoreapp3.1</TargetFramework>
  4. </PropertyGroup>
  5. <ItemGroup>
  6. <PackageReference Include="Microsoft.AspNetCore.Diagnostics.EntityFrameworkCore" Version="3.1.0" />
  7. <PackageReference Include="Microsoft.AspNetCore.Identity.EntityFrameworkCore" Version="3.1.0" />
  8. <PackageReference Include="Microsoft.AspNetCore.Identity.UI" Version="3.1.0" />
  9. <PackageReference Include="Microsoft.EntityFrameworkCore.Design" Version="3.1.0" />
  10. <PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer" Version="3.1.0" />
  11. <PackageReference Include="Microsoft.EntityFrameworkCore.Tools" Version="3.1.0" />
  12. <PackageReference Include="Microsoft.VisualStudio.Web.CodeGeneration.Design" Version="3.1.0" />
  13. </ItemGroup>
  14. </Project>

在项目文件夹中,运行具有所需选项的标识 scaffolder。例如,若要设置默认 UI 和最小文件数的标识,请运行以下命令:

  1. dotnet aspnet-codegenerator identity --useDefaultUI

可选:将登录名 partial (LoginPartial)添加到_Views/Shared/_Layout文件:

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="utf-8" />
  5. <meta name="viewport" content="width=device-width, initial-scale=1.0" />
  6. <title>@ViewData["Title"] - WebRP</title>
  7. <link rel="stylesheet" href="~/lib/bootstrap/dist/css/bootstrap.min.css" />
  8. <link rel="stylesheet" href="~/css/site.css" />
  9. </head>
  10. <body>
  11. <header>
  12. <nav class="navbar navbar-expand-sm navbar-toggleable-sm navbar-light bg-white border-bottom box-shadow mb-3">
  13. <div class="container">
  14. <a class="navbar-brand" asp-area="" asp-page="/Index">WebRP</a>
  15. <button class="navbar-toggler" type="button" data-toggle="collapse" data-target=".navbar-collapse" aria-controls="navbarSupportedContent"
  16. aria-expanded="false" aria-label="Toggle navigation">
  17. <span class="navbar-toggler-icon"></span>
  18. </button>
  19. <div class="navbar-collapse collapse d-sm-inline-flex flex-sm-row-reverse">
  20. <partial name="_LoginPartial" />
  21. <ul class="navbar-nav flex-grow-1">
  22. <li class="nav-item">
  23. <a class="nav-link text-dark" asp-area="" asp-page="/Index">Home</a>
  24. </li>
  25. <li class="nav-item">
  26. <a class="nav-link text-dark" asp-area="" asp-page="/Privacy">Privacy</a>
  27. </li>
  28. </ul>
  29. </div>
  30. </div>
  31. </nav>
  32. </header>
  33. <div class="container">
  34. <main role="main" class="pb-3">
  35. @RenderBody()
  36. </main>
  37. </div>
  38. <footer class="border-top footer text-muted">
  39. <div class="container">
  40. &copy; 2019 - WebRP - <a asp-area="" asp-page="/Privacy">Privacy</a>
  41. </div>
  42. </footer>
  43. <script src="~/lib/jquery/dist/jquery.min.js"></script>
  44. <script src="~/lib/bootstrap/dist/js/bootstrap.bundle.min.js"></script>
  45. <script src="~/js/site.js" asp-append-version="true"></script>
  46. @RenderSection("Scripts", required: false)
  47. </body>
  48. </html>
  • Pages/shared/_LoginPartial cshtml文件移动到Views/shared/_LoginPartial。 cshtml

区域/标识/IdentityHostingStartup中配置标识。有关详细信息,请参阅 IHostingStartup。

生成的标识数据库代码需要Entity Framework Core 迁移创建迁移并更新数据库。例如,运行以下命令:

在 Visual Studio包管理器控制台中:

  1. Install-Package Microsoft.AspNetCore.Diagnostics.EntityFrameworkCore
  2. Add-Migration CreateIdentitySchema
  3. Update-Database
  1. dotnet ef migrations add CreateIdentitySchema
  2. dotnet ef database update

Add-Migration 命令的 "CreateIdentitySchema" name 参数是任意的。"CreateIdentitySchema" 介绍迁移。

用类似于下面的代码更新 Startup 类:

  1. public class Startup
  2. {
  3. public Startup(IConfiguration configuration)
  4. {
  5. Configuration = configuration;
  6. }
  7. public IConfiguration Configuration { get; }
  8. public void ConfigureServices(IServiceCollection services)
  9. {
  10. services.AddDbContext<ApplicationDbContext>(options =>
  11. options.UseSqlServer(
  12. Configuration.GetConnectionString("DefaultConnection")));
  13. services.AddDefaultIdentity<IdentityUser>(options => options.SignIn.RequireConfirmedAccount = true)
  14. .AddEntityFrameworkStores<ApplicationDbContext>();
  15. services.AddControllersWithViews();
  16. services.AddRazorPages();
  17. }
  18. public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
  19. {
  20. if (env.IsDevelopment())
  21. {
  22. app.UseDeveloperExceptionPage();
  23. app.UseDatabaseErrorPage();
  24. }
  25. else
  26. {
  27. app.UseExceptionHandler("/Home/Error");
  28. app.UseHsts();
  29. }
  30. app.UseHttpsRedirection();
  31. app.UseStaticFiles();
  32. app.UseRouting();
  33. app.UseAuthentication();
  34. app.UseAuthorization();
  35. app.UseEndpoints(endpoints =>
  36. {
  37. endpoints.MapControllerRoute(
  38. name: "default",
  39. pattern: "{controller=Home}/{action=Index}/{id?}");
  40. endpoints.MapRazorPages();
  41. });
  42. }
  43. }

建议 UseHsts,但不是必需的。有关详细信息,请参阅HTTP 严格传输安全协议

使用授权将标识基架到 MVC 项目Scaffold identity into an MVC project with authorization

运行标识 scaffolder:

  • 解决方案资源管理器中,右键单击项目 >添加> 新的基架项
  • 在 "添加基架" 对话框的左窗格中,选择 "标识" > "添加"。
  • 在 "添加标识" 对话框中,选择所需的选项。
    • 选择现有的布局页,否则将用错误的标记覆盖你的布局文件。选择现有 _布局 cshtml文件时,会覆盖它。

例如: MVC 项目的 Razor Pages ~/Views/Shared/_Layout.cshtml~/Pages/Shared/_Layout.cshtml

  • 若要使用现有的数据上下文,请至少选择一个要重写的文件。必须至少选择一个文件以添加数据上下文。
    • 选择数据上下文类。
    • 选择 添加
  • 创建新的用户上下文,并可能为标识创建自定义用户类:
    • 选择 " + " 按钮以创建新的数据上下文类
    • 选择 添加

注意:如果要创建新的用户上下文,则无需选择要重写的文件。

如果以前未安装 ASP.NET Core 基架,请立即进行安装:

  1. dotnet tool install -g dotnet-aspnet-codegenerator

将所需的 NuGet 包引用添加到项目(*.csproj)文件中。在项目目录中运行以下命令:

  1. dotnet add package Microsoft.VisualStudio.Web.CodeGeneration.Design
  2. dotnet add package Microsoft.EntityFrameworkCore.Design
  3. dotnet add package Microsoft.AspNetCore.Identity.EntityFrameworkCore
  4. dotnet add package Microsoft.AspNetCore.Identity.UI
  5. dotnet add package Microsoft.EntityFrameworkCore.SqlServer
  6. dotnet add package Microsoft.EntityFrameworkCore.Tools

运行以下命令以列出标识基架选项:

  1. dotnet aspnet-codegenerator identity -h

如果出现基架错误,请验证目标框架名字对象 (TFM) 是否与项目文件中的 NuGet 包版本相匹配。例如,以下项目文件包含适用于 .NET Core 的版本 3.1 和所列的 NuGet 包:

  1. <Project Sdk="Microsoft.NET.Sdk.Web">
  2. <PropertyGroup>
  3. <TargetFramework>netcoreapp3.1</TargetFramework>
  4. </PropertyGroup>
  5. <ItemGroup>
  6. <PackageReference Include="Microsoft.AspNetCore.Diagnostics.EntityFrameworkCore" Version="3.1.0" />
  7. <PackageReference Include="Microsoft.AspNetCore.Identity.EntityFrameworkCore" Version="3.1.0" />
  8. <PackageReference Include="Microsoft.AspNetCore.Identity.UI" Version="3.1.0" />
  9. <PackageReference Include="Microsoft.EntityFrameworkCore.Design" Version="3.1.0" />
  10. <PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer" Version="3.1.0" />
  11. <PackageReference Include="Microsoft.EntityFrameworkCore.Tools" Version="3.1.0" />
  12. <PackageReference Include="Microsoft.VisualStudio.Web.CodeGeneration.Design" Version="3.1.0" />
  13. </ItemGroup>
  14. </Project>

在项目文件夹中,运行具有所需选项的标识 scaffolder。例如,若要设置默认 UI 和最小文件数的标识,请运行以下命令。为数据库上下文使用正确的完全限定名:

  1. dotnet aspnet-codegenerator identity -dc MyWeb.Data.ApplicationDbContext --files "Account.Register;Account.Login"

PowerShell 使用分号作为命令分隔符。使用 PowerShell 时,请在文件列表中转义分号,或将文件列表置于双引号中。例如:

  1. dotnet aspnet-codegenerator identity -dc MyWeb.Data.ApplicationDbContext --files "Account.Register;Account.Login;Account.Logout"

如果在未指定 —files 标志或 —useDefaultUI 标志的情况下运行标识 scaffolder,则会在项目中创建所有可用的标识 UI 页。

运行标识 scaffolder:

  • 解决方案资源管理器中,右键单击项目 >添加> 新的基架项
  • 在 "添加基架" 对话框的左窗格中,选择 "标识" > "添加"。
  • 在 "添加标识" 对话框中,选择所需的选项。
    • 选择现有的布局页,否则将用错误的标记覆盖你的布局文件。选择现有 _布局 cshtml文件时,会覆盖它。

例如: MVC 项目的 Razor Pages ~/Views/Shared/_Layout.cshtml~/Pages/Shared/_Layout.cshtml

  • 若要使用现有的数据上下文,请至少选择一个要重写的文件。必须至少选择一个文件以添加数据上下文。
    • 选择数据上下文类。
    • 选择 添加
  • 创建新的用户上下文,并可能为标识创建自定义用户类:
    • 选择 " + " 按钮以创建新的数据上下文类
    • 选择 添加

注意:如果要创建新的用户上下文,则无需选择要重写的文件。

如果以前未安装 ASP.NET Core 基架,请立即进行安装:

  1. dotnet tool install -g dotnet-aspnet-codegenerator

将对VisualStudio的包引用添加到项目(*.csproj)文件中。在项目目录中运行以下命令:

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

运行以下命令以列出标识基架选项:

  1. dotnet aspnet-codegenerator identity -h

在项目文件夹中,运行具有所需选项的标识 scaffolder。例如,若要设置默认 UI 和最小文件数的标识,请运行以下命令。为数据库上下文使用正确的完全限定名:

  1. dotnet aspnet-codegenerator identity -dc MyWeb.Data.ApplicationDbContext --files "Account.Register;Account.Login"

PowerShell 使用分号作为命令分隔符。使用 PowerShell 时,请在文件列表中转义分号,或将文件列表置于双引号中。例如:

  1. dotnet aspnet-codegenerator identity -dc MyWeb.Data.ApplicationDbContext --files "Account.Register;Account.Login;Account.Logout"

如果在未指定 —files 标志或 —useDefaultUI 标志的情况下运行标识 scaffolder,则会在项目中创建所有可用的标识 UI 页。

创建完全标识 UI 源Create full identity UI source

若要保持对标识 UI 的完全控制,请运行标识 scaffolder,并选择 "替代所有文件"。

以下突出显示的代码显示默认标识 UI 替换标识在 ASP.NET Core 2.1 web 应用的更改。你可能希望执行此操作以对标识 UI 具有完全控制。

  1. public void ConfigureServices(IServiceCollection services)
  2. {
  3. services.Configure<CookiePolicyOptions>(options =>
  4. {
  5. options.CheckConsentNeeded = context => true;
  6. options.MinimumSameSitePolicy = SameSiteMode.None;
  7. });
  8. services.AddDbContext<ApplicationDbContext>(options =>
  9. options.UseSqlServer(
  10. Configuration.GetConnectionString("DefaultConnection")));
  11. services.AddIdentity<IdentityUser, IdentityRole>()
  12. // services.AddDefaultIdentity<IdentityUser>()
  13. .AddEntityFrameworkStores<ApplicationDbContext>()
  14. .AddDefaultTokenProviders();
  15. services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1)
  16. .AddRazorPagesOptions(options =>
  17. {
  18. options.AllowAreas = true;
  19. options.Conventions.AuthorizeAreaFolder("Identity", "/Account/Manage");
  20. options.Conventions.AuthorizeAreaPage("Identity", "/Account/Logout");
  21. });
  22. services.ConfigureApplicationCookie(options =>
  23. {
  24. options.LoginPath = $"/Identity/Account/Login";
  25. options.LogoutPath = $"/Identity/Account/Logout";
  26. options.AccessDeniedPath = $"/Identity/Account/AccessDenied";
  27. });
  28. // using Microsoft.AspNetCore.Identity.UI.Services;
  29. services.AddSingleton<IEmailSender, EmailSender>();
  30. }

在以下代码中,将替换默认标识:

  1. services.AddIdentity<IdentityUser, IdentityRole>()
  2. // services.AddDefaultIdentity<IdentityUser>()
  3. .AddEntityFrameworkStores<ApplicationDbContext>()
  4. .AddDefaultTokenProviders();

下面的代码将设置LoginPathLogoutPathAccessDeniedPath

  1. services.ConfigureApplicationCookie(options =>
  2. {
  3. options.LoginPath = $"/Identity/Account/Login";
  4. options.LogoutPath = $"/Identity/Account/Logout";
  5. options.AccessDeniedPath = $"/Identity/Account/AccessDenied";
  6. });

注册 IEmailSender 实现,例如:

  1. // using Microsoft.AspNetCore.Identity.UI.Services;
  2. services.AddSingleton<IEmailSender, EmailSender>();
  1. public class EmailSender : IEmailSender
  2. {
  3. public Task SendEmailAsync(string email, string subject, string message)
  4. {
  5. return Task.CompletedTask;
  6. }
  7. }

禁用注册页Disable register page

禁用用户注册:

  • 基架标识。包括帐户. Register、RegisterConfirmation。例如:
  1. dotnet aspnet-codegenerator identity -dc RPauth.Data.ApplicationDbContext --files "Account.Register;Account.Login;Account.RegisterConfirmation"
  • 更新区域/标识/页/帐户/注册. .cs ,使用户无法从此终结点注册:
  1. public class RegisterModel : PageModel
  2. {
  3. public IActionResult OnGet()
  4. {
  5. return RedirectToPage("Login");
  6. }
  7. public IActionResult OnPost()
  8. {
  9. return RedirectToPage("Login");
  10. }
  11. }
  • 更新区域/标识/页/帐户/Register. cshtml ,使其与前面的更改一致:
  1. @page
  2. @model RegisterModel
  3. @{
  4. ViewData["Title"] = "Go to Login";
  5. }
  6. <h1>@ViewData["Title"]</h1>
  7. <li class="nav-item">
  8. <a class="nav-link text-dark" asp-area="Identity" asp-page="/Account/Login">Login</a>
  9. </li>
  • 注释掉或删除区域/标识/页面/帐户/登录名中的注册链接
  1. @*
  2. <p>
  3. <a asp-page="./Register" asp-route-returnUrl="@Model.ReturnUrl">Register as a new user</a>
  4. </p>
  5. *@
  • 更新Areas/Identity/Pages/Account/RegisterConfirmation页。

    • 删除来自 cshtml 文件的代码和链接。
    • PageModel中删除确认代码:
[AllowAnonymous]
  public class RegisterConfirmationModel : PageModel
  {
      public IActionResult OnGet()
      {  
          return Page();
      }
  }

使用其他应用添加用户Use another app to add users

提供一种在 web 应用外部添加用户的机制。用于添加用户的选项包括:

  • 专用的管理 web 应用。
  • 控制台应用。

下面的代码概述了一种添加用户的方法:

  • 用户列表将读入内存中。
  • 为每个用户生成一个强唯一密码。
  • 用户已添加到标识数据库。
  • 系统会通知用户并通知用户更改密码。
public class Program
{
    public static void Main(string[] args)
    {
        var host = CreateHostBuilder(args).Build();

        using (var scope = host.Services.CreateScope())
        {
            var services = scope.ServiceProvider;

            try
            {
                var context = services.GetRequiredService<AppDbCntx>();
                context.Database.Migrate();

                var config = host.Services.GetRequiredService<IConfiguration>();
                var userList = config.GetSection("userList").Get<List<string>>();

                SeedData.Initialize(services, userList).Wait();
            }
            catch (Exception ex)
            {
                var logger = services.GetRequiredService<ILogger<Program>>();
                logger.LogError(ex, "An error occurred adding users.");
            }
        }

        host.Run();
    }

    public static IHostBuilder CreateHostBuilder(string[] args) =>
        Host.CreateDefaultBuilder(args)
            .ConfigureWebHostDefaults(webBuilder =>
            {
                webBuilder.UseStartup<Startup>();
            });
}

下面的代码概述了如何添加用户:


public static async Task Initialize(IServiceProvider serviceProvider,
                                    List<string> userList)
{
    var userManager = serviceProvider.GetService<UserManager<IdentityUser>>();

    foreach (var userName in userList)
    {
        var userPassword = GenerateSecurePassword();
        var userId = await EnsureUser(userManager, userName, userPassword);

        NotifyUser(userName, userPassword);
    }
}

private static async Task<string> EnsureUser(UserManager<IdentityUser> userManager,
                                             string userName, string userPassword)
{
    var user = await userManager.FindByNameAsync(userName);

    if (user == null)
    {
        user = new IdentityUser(userName)
        {
            EmailConfirmed = true
        };
        await userManager.CreateAsync(user, userPassword);
    }

    return user.Id;
}

对于生产方案,可以遵循类似的方法。

禁止发布静态标识资产Prevent publish of static Identity assets

要阻止将静态标识资产发布到 Web 根目录,请参阅 ASP.NET Core 上的标识简介

其他资源Additional resources

ASP.NET Core 2.1 和更高版本提供作为Razor 类库ASP.NET Core 标识包含标识的应用程序可以应用 scaffolder 来有选择地添加标识 Razor 类库中包含的源代码(RCL)。建议生成源代码,以便修改代码和更改行为。例如,可以指示基架生成在注册过程中使用的代码。生成的代码优先于标识 RCL 中的相同代码。若要完全控制 UI,而不使用默认的 RCL,请参阅创建完全标识 UI 源部分。

包含身份验证的应用程序可以应用 scaffolder 来添加 RCL 标识包。可以选择要生成的标识代码。

尽管 scaffolder 生成了大部分必要的代码,但你必须更新项目才能完成此过程。本文档介绍完成标识基架更新所需的步骤。

运行标识 scaffolder 时,会在项目目录中创建一个ScaffoldingReadme文件。ScaffoldingReadme文件包含有关完成标识基架更新所需内容的一般说明。本文档包含的有关ScaffoldingReadme文件的完整说明。

建议使用显示文件差异的源代码管理系统,并使您能够回退更改。运行标识 scaffolder 后检查更改。

备注

使用双重身份验证帐户确认和密码恢复,以及使用标识的其他安全功能时,需要提供服务。基架标识时不生成服务或服务存根。要启用这些功能,必须手动添加服务。例如,请参阅需要确认电子邮件

将标识基架到空项目中Scaffold identity into an empty project

运行标识 scaffolder:

  • 解决方案资源管理器中,右键单击项目 >添加 > 新的基架项
  • 在 "添加基架" 对话框的左窗格中,选择 "标识" > "添加"。
  • 在 "添加标识" 对话框中,选择所需的选项。
    • 选择现有的布局页,否则将用错误的标记覆盖你的布局文件。例如 ~/Pages/Shared/_Layout.cshtml Razor Pages MVC 项目的 ~/Views/Shared/_Layout.cshtml
    • 选择 " + " 按钮以创建新的数据上下文类
  • 选择 "添加"。

如果以前未安装 ASP.NET Core 基架,请立即进行安装:

dotnet tool install -g dotnet-aspnet-codegenerator

将所需的 NuGet 包引用添加到项目(*.csproj)文件中。在项目目录中运行以下命令:

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

运行以下命令以列出标识基架选项:

dotnet aspnet-codegenerator identity -h

如果出现基架错误,请验证目标框架名字对象 (TFM) 是否与项目文件中的 NuGet 包版本相匹配。例如,以下项目文件包含适用于 .NET Core 的版本 3.1 和所列的 NuGet 包:

<Project Sdk="Microsoft.NET.Sdk.Web">

  <PropertyGroup>
    <TargetFramework>netcoreapp3.1</TargetFramework>
  </PropertyGroup>

  <ItemGroup>
    <PackageReference Include="Microsoft.AspNetCore.Diagnostics.EntityFrameworkCore" Version="3.1.0" />
    <PackageReference Include="Microsoft.AspNetCore.Identity.EntityFrameworkCore" Version="3.1.0" />
    <PackageReference Include="Microsoft.AspNetCore.Identity.UI" Version="3.1.0" />
    <PackageReference Include="Microsoft.EntityFrameworkCore.Design" Version="3.1.0" />
    <PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer" Version="3.1.0" />
    <PackageReference Include="Microsoft.EntityFrameworkCore.Tools" Version="3.1.0" />
    <PackageReference Include="Microsoft.VisualStudio.Web.CodeGeneration.Design" Version="3.1.0" />
  </ItemGroup>

</Project>

在项目文件夹中,运行具有所需选项的标识 scaffolder。例如,若要设置默认 UI 和最小文件数的标识,请运行以下命令:

dotnet aspnet-codegenerator identity --useDefaultUI

将以下突出显示的调用添加到 Startup 类:

public class Startup
{        
    public void ConfigureServices(IServiceCollection services)
    {
        services.AddMvc();
    }

    // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
    public void Configure(IApplicationBuilder app, IHostingEnvironment env)
    {
        if (env.IsDevelopment())
        {
            app.UseDeveloperExceptionPage();
        }
        else
        {
            app.UseHsts();
        }

        app.UseHttpsRedirection();
        app.UseStaticFiles();
        app.UseAuthentication();
        app.UseMvc();
    }
}

建议 UseHsts,但不是必需的。有关详细信息,请参阅HTTP 严格传输安全协议

生成的标识数据库代码需要Entity Framework Core 迁移创建迁移并更新数据库。例如,运行以下命令:

在 Visual Studio包管理器控制台中:

Install-Package Microsoft.AspNetCore.Diagnostics.EntityFrameworkCore
Add-Migration CreateIdentitySchema
Update-Database
dotnet ef migrations add CreateIdentitySchema
dotnet ef database update

Add-Migration 命令的 "CreateIdentitySchema" name 参数是任意的。"CreateIdentitySchema" 介绍迁移。

将标识基架到 Razor 项目,而无需现有授权Scaffold identity into a Razor project without existing authorization

运行标识 scaffolder:

  • 解决方案资源管理器中,右键单击项目 >添加 > 新的基架项
  • 在 "添加基架" 对话框的左窗格中,选择 "标识" > "添加"。
  • 在 "添加标识" 对话框中,选择所需的选项。
    • 选择现有的布局页,否则将用错误的标记覆盖你的布局文件。例如 ~/Pages/Shared/_Layout.cshtml Razor Pages MVC 项目的 ~/Views/Shared/_Layout.cshtml
    • 选择 " + " 按钮以创建新的数据上下文类
  • 选择 "添加"。

如果以前未安装 ASP.NET Core 基架,请立即进行安装:

dotnet tool install -g dotnet-aspnet-codegenerator

将所需的 NuGet 包引用添加到项目(*.csproj)文件中。在项目目录中运行以下命令:

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

运行以下命令以列出标识基架选项:

dotnet aspnet-codegenerator identity -h

如果出现基架错误,请验证目标框架名字对象 (TFM) 是否与项目文件中的 NuGet 包版本相匹配。例如,以下项目文件包含适用于 .NET Core 的版本 3.1 和所列的 NuGet 包:

<Project Sdk="Microsoft.NET.Sdk.Web">

  <PropertyGroup>
    <TargetFramework>netcoreapp3.1</TargetFramework>
  </PropertyGroup>

  <ItemGroup>
    <PackageReference Include="Microsoft.AspNetCore.Diagnostics.EntityFrameworkCore" Version="3.1.0" />
    <PackageReference Include="Microsoft.AspNetCore.Identity.EntityFrameworkCore" Version="3.1.0" />
    <PackageReference Include="Microsoft.AspNetCore.Identity.UI" Version="3.1.0" />
    <PackageReference Include="Microsoft.EntityFrameworkCore.Design" Version="3.1.0" />
    <PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer" Version="3.1.0" />
    <PackageReference Include="Microsoft.EntityFrameworkCore.Tools" Version="3.1.0" />
    <PackageReference Include="Microsoft.VisualStudio.Web.CodeGeneration.Design" Version="3.1.0" />
  </ItemGroup>

</Project>

在项目文件夹中,运行具有所需选项的标识 scaffolder。例如,若要设置默认 UI 和最小文件数的标识,请运行以下命令:

dotnet aspnet-codegenerator identity --useDefaultUI

区域/标识/IdentityHostingStartup中配置标识。有关详细信息,请参阅IHostingStartup

迁移、UseAuthentication 和布局Migrations, UseAuthentication, and layout

生成的标识数据库代码需要Entity Framework Core 迁移创建迁移并更新数据库。例如,运行以下命令:

在 Visual Studio包管理器控制台中:

Install-Package Microsoft.AspNetCore.Diagnostics.EntityFrameworkCore
Add-Migration CreateIdentitySchema
Update-Database
dotnet ef migrations add CreateIdentitySchema
dotnet ef database update

Add-Migration 命令的 "CreateIdentitySchema" name 参数是任意的。"CreateIdentitySchema" 介绍迁移。

启用身份验证Enable authentication

Startup 类的 Configure 方法中,在 UseStaticFiles后调用UseAuthentication

public class Startup
{
    public Startup(IConfiguration configuration)
    {
        Configuration = configuration;
    }

    public IConfiguration Configuration { get; }

    public void ConfigureServices(IServiceCollection services)
    {
        services.AddMvc();
    }

    public void Configure(IApplicationBuilder app, IHostingEnvironment env)
    {
        if (env.IsDevelopment())
        {
            app.UseDeveloperExceptionPage();
        }
        else
        {
            app.UseExceptionHandler("/Error");
            app.UseHsts();
        }

        app.UseHttpsRedirection();
        app.UseStaticFiles();
        app.UseAuthentication();

        app.UseMvc();
    }
}

建议 UseHsts,但不是必需的。有关详细信息,请参阅HTTP 严格传输安全协议

布局更改Layout changes

可选:将登录名部分(_LoginPartial)添加到布局文件中:

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>@ViewData["Title"] - RazorNoAuth8</title>

    <environment include="Development">
        <link rel="stylesheet" href="~/lib/bootstrap/dist/css/bootstrap.css" />
        <link rel="stylesheet" href="~/css/site.css" />
    </environment>
    <environment exclude="Development">
        <link rel="stylesheet" href="https://ajax.aspnetcdn.com/ajax/bootstrap/3.3.7/css/bootstrap.min.css"
              asp-fallback-href="~/lib/bootstrap/dist/css/bootstrap.min.css"
              asp-fallback-test-class="sr-only" asp-fallback-test-property="position" asp-fallback-test-value="absolute" />
        <link rel="stylesheet" href="~/css/site.min.css" asp-append-version="true" />
    </environment>
</head>
<body>
    <nav class="navbar navbar-inverse navbar-fixed-top">
        <div class="container">
            <div class="navbar-header">
                <button type="button" class="navbar-toggle" data-toggle="collapse" data-target=".navbar-collapse">
                    <span class="sr-only">Toggle navigation</span>
                    <span class="icon-bar"></span>
                    <span class="icon-bar"></span>
                    <span class="icon-bar"></span>
                </button>
                <a asp-page="/Index" class="navbar-brand">RazorNoAuth8</a>
            </div>
            <div class="navbar-collapse collapse">
                <ul class="nav navbar-nav">
                    <li><a asp-page="/Index">Home</a></li>
                    <li><a asp-page="/About">About</a></li>
                    <li><a asp-page="/Contact">Contact</a></li>
                </ul>
                <partial name="_LoginPartial" />
            </div>
        </div>
    </nav>

    <partial name="_CookieConsentPartial" />

    <div class="container body-content">
        @RenderBody()
        <hr />
        <footer>
            <p>&copy; 2018 - RazorNoAuth8</p>
        </footer>
    </div>

    <environment include="Development">
        <script src="~/lib/jquery/dist/jquery.js"></script>
        <script src="~/lib/bootstrap/dist/js/bootstrap.js"></script>
        <script src="~/js/site.js" asp-append-version="true"></script>
    </environment>
    <environment exclude="Development">
        <script src="https://ajax.aspnetcdn.com/ajax/jquery/jquery-3.3.1.min.js"
                asp-fallback-src="~/lib/jquery/dist/jquery.min.js"
                asp-fallback-test="window.jQuery"
                crossorigin="anonymous"
                integrity="sha384-K+ctZQ+LL8q6tP7I94W+qzQsfRV2a+AfHIi9k8z8l9ggpc8X+Ytst4yBo/hH+8Fk">
        </script>
        <script src="https://ajax.aspnetcdn.com/ajax/bootstrap/3.3.7/bootstrap.min.js"
                asp-fallback-src="~/lib/bootstrap/dist/js/bootstrap.min.js"
                asp-fallback-test="window.jQuery && window.jQuery.fn && window.jQuery.fn.modal"
                crossorigin="anonymous"
                integrity="sha384-Tc5IQib027qvyjSMfHjOMaLkfuWVxZxUPnCJA7l2mCWNIpG9mGCD8wGNIcPD7Txa">
        </script>
        <script src="~/js/site.min.js" asp-append-version="true"></script>
    </environment>

    @RenderSection("Scripts", required: false)
</body>
</html>

使用授权将标识基架到 Razor 项目Scaffold identity into a Razor project with authorization

运行标识 scaffolder:

  • 解决方案资源管理器中,右键单击项目 >添加> 新的基架项
  • 在 "添加基架" 对话框的左窗格中,选择 "标识" > "添加"。
  • 在 "添加标识" 对话框中,选择所需的选项。
    • 选择现有的布局页,否则将用错误的标记覆盖你的布局文件。选择现有 _布局 cshtml文件时,会覆盖它。

例如: MVC 项目的 Razor Pages ~/Views/Shared/_Layout.cshtml~/Pages/Shared/_Layout.cshtml

  • 若要使用现有的数据上下文,请至少选择一个要重写的文件。必须至少选择一个文件以添加数据上下文。
    • 选择数据上下文类。
    • 选择 添加
  • 创建新的用户上下文,并可能为标识创建自定义用户类:
    • 选择 " + " 按钮以创建新的数据上下文类
    • 选择 添加

注意:如果要创建新的用户上下文,则无需选择要重写的文件。

如果以前未安装 ASP.NET Core 基架,请立即进行安装:

dotnet tool install -g dotnet-aspnet-codegenerator

将所需的 NuGet 包引用添加到项目(*.csproj)文件中。在项目目录中运行以下命令:

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

运行以下命令以列出标识基架选项:

dotnet aspnet-codegenerator identity -h

如果出现基架错误,请验证目标框架名字对象 (TFM) 是否与项目文件中的 NuGet 包版本相匹配。例如,以下项目文件包含适用于 .NET Core 的版本 3.1 和所列的 NuGet 包:

<Project Sdk="Microsoft.NET.Sdk.Web">

  <PropertyGroup>
    <TargetFramework>netcoreapp3.1</TargetFramework>
  </PropertyGroup>

  <ItemGroup>
    <PackageReference Include="Microsoft.AspNetCore.Diagnostics.EntityFrameworkCore" Version="3.1.0" />
    <PackageReference Include="Microsoft.AspNetCore.Identity.EntityFrameworkCore" Version="3.1.0" />
    <PackageReference Include="Microsoft.AspNetCore.Identity.UI" Version="3.1.0" />
    <PackageReference Include="Microsoft.EntityFrameworkCore.Design" Version="3.1.0" />
    <PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer" Version="3.1.0" />
    <PackageReference Include="Microsoft.EntityFrameworkCore.Tools" Version="3.1.0" />
    <PackageReference Include="Microsoft.VisualStudio.Web.CodeGeneration.Design" Version="3.1.0" />
  </ItemGroup>

</Project>

在项目文件夹中,运行具有所需选项的标识 scaffolder。例如,若要设置默认 UI 和最小文件数的标识,请运行以下命令。为数据库上下文使用正确的完全限定名:

dotnet aspnet-codegenerator identity -dc MyWeb.Data.ApplicationDbContext --files "Account.Register;Account.Login"

PowerShell 使用分号作为命令分隔符。使用 PowerShell 时,请在文件列表中转义分号,或将文件列表置于双引号中。例如:

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

如果在未指定 —files 标志或 —useDefaultUI 标志的情况下运行标识 scaffolder,则会在项目中创建所有可用的标识 UI 页。

运行标识 scaffolder:

  • 解决方案资源管理器中,右键单击项目 >添加> 新的基架项
  • 在 "添加基架" 对话框的左窗格中,选择 "标识" > "添加"。
  • 在 "添加标识" 对话框中,选择所需的选项。
    • 选择现有的布局页,否则将用错误的标记覆盖你的布局文件。选择现有 _布局 cshtml文件时,会覆盖它。

例如: MVC 项目的 Razor Pages ~/Views/Shared/_Layout.cshtml~/Pages/Shared/_Layout.cshtml

  • 若要使用现有的数据上下文,请至少选择一个要重写的文件。必须至少选择一个文件以添加数据上下文。
    • 选择数据上下文类。
    • 选择 添加
  • 创建新的用户上下文,并可能为标识创建自定义用户类:
    • 选择 " + " 按钮以创建新的数据上下文类
    • 选择 添加

注意:如果要创建新的用户上下文,则无需选择要重写的文件。

如果以前未安装 ASP.NET Core 基架,请立即进行安装:

dotnet tool install -g dotnet-aspnet-codegenerator

将对VisualStudio的包引用添加到项目(*.csproj)文件中。在项目目录中运行以下命令:

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

运行以下命令以列出标识基架选项:

dotnet aspnet-codegenerator identity -h

在项目文件夹中,运行具有所需选项的标识 scaffolder。例如,若要设置默认 UI 和最小文件数的标识,请运行以下命令。为数据库上下文使用正确的完全限定名:

dotnet aspnet-codegenerator identity -dc MyWeb.Data.ApplicationDbContext --files "Account.Register;Account.Login"

PowerShell 使用分号作为命令分隔符。使用 PowerShell 时,请在文件列表中转义分号,或将文件列表置于双引号中。例如:

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

如果在未指定 —files 标志或 —useDefaultUI 标志的情况下运行标识 scaffolder,则会在项目中创建所有可用的标识 UI 页。

某些标识选项在区域/标识/IdentityHostingStartup中配置。有关详细信息,请参阅IHostingStartup

不使用现有授权将标识基架到 MVC 项目Scaffold identity into an MVC project without existing authorization

运行标识 scaffolder:

  • 解决方案资源管理器中,右键单击项目 >添加 > 新的基架项
  • 在 "添加基架" 对话框的左窗格中,选择 "标识" > "添加"。
  • 在 "添加标识" 对话框中,选择所需的选项。
    • 选择现有的布局页,否则将用错误的标记覆盖你的布局文件。例如 ~/Pages/Shared/_Layout.cshtml Razor Pages MVC 项目的 ~/Views/Shared/_Layout.cshtml
    • 选择 " + " 按钮以创建新的数据上下文类
  • 选择 "添加"。

如果以前未安装 ASP.NET Core 基架,请立即进行安装:

dotnet tool install -g dotnet-aspnet-codegenerator

将所需的 NuGet 包引用添加到项目(*.csproj)文件中。在项目目录中运行以下命令:

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

运行以下命令以列出标识基架选项:

dotnet aspnet-codegenerator identity -h

如果出现基架错误,请验证目标框架名字对象 (TFM) 是否与项目文件中的 NuGet 包版本相匹配。例如,以下项目文件包含适用于 .NET Core 的版本 3.1 和所列的 NuGet 包:

<Project Sdk="Microsoft.NET.Sdk.Web">

  <PropertyGroup>
    <TargetFramework>netcoreapp3.1</TargetFramework>
  </PropertyGroup>

  <ItemGroup>
    <PackageReference Include="Microsoft.AspNetCore.Diagnostics.EntityFrameworkCore" Version="3.1.0" />
    <PackageReference Include="Microsoft.AspNetCore.Identity.EntityFrameworkCore" Version="3.1.0" />
    <PackageReference Include="Microsoft.AspNetCore.Identity.UI" Version="3.1.0" />
    <PackageReference Include="Microsoft.EntityFrameworkCore.Design" Version="3.1.0" />
    <PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer" Version="3.1.0" />
    <PackageReference Include="Microsoft.EntityFrameworkCore.Tools" Version="3.1.0" />
    <PackageReference Include="Microsoft.VisualStudio.Web.CodeGeneration.Design" Version="3.1.0" />
  </ItemGroup>

</Project>

在项目文件夹中,运行具有所需选项的标识 scaffolder。例如,若要设置默认 UI 和最小文件数的标识,请运行以下命令:

dotnet aspnet-codegenerator identity --useDefaultUI

可选:将登录名 partial (LoginPartial)添加到_Views/Shared/_Layout文件:

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>@ViewData["Title"] - MvcNoAuth3</title>

    <environment include="Development">
        <link rel="stylesheet" href="~/lib/bootstrap/dist/css/bootstrap.css" />
        <link rel="stylesheet" href="~/css/site.css" />
    </environment>
    <environment exclude="Development">
        <link rel="stylesheet" href="https://ajax.aspnetcdn.com/ajax/bootstrap/3.3.7/css/bootstrap.min.css"
              asp-fallback-href="~/lib/bootstrap/dist/css/bootstrap.min.css"
              asp-fallback-test-class="sr-only" asp-fallback-test-property="position" asp-fallback-test-value="absolute" />
        <link rel="stylesheet" href="~/css/site.min.css" asp-append-version="true" />
    </environment>
</head>
<body>
    <nav class="navbar navbar-inverse navbar-fixed-top">
        <div class="container">
            <div class="navbar-header">
                <button type="button" class="navbar-toggle" data-toggle="collapse" data-target=".navbar-collapse">
                    <span class="sr-only">Toggle navigation</span>
                    <span class="icon-bar"></span>
                    <span class="icon-bar"></span>
                    <span class="icon-bar"></span>
                </button>
                <a asp-area="" asp-controller="Home" asp-action="Index" class="navbar-brand">MvcNoAuth3</a>
            </div>
            <div class="navbar-collapse collapse">
                <ul class="nav navbar-nav">
                    <li><a asp-area="" asp-controller="Home" asp-action="Index">Home</a></li>
                    <li><a asp-area="" asp-controller="Home" asp-action="About">About</a></li>
                    <li><a asp-area="" asp-controller="Home" asp-action="Contact">Contact</a></li>
                </ul>
                <partial name="_LoginPartial" />
            </div>
        </div>
    </nav>

    <partial name="_CookieConsentPartial" />

    <div class="container body-content">
        @RenderBody()
        <hr />
        <footer>
            <p>&copy; 2018 - MvcNoAuth3</p>
        </footer>
    </div>

    <environment include="Development">
        <script src="~/lib/jquery/dist/jquery.js"></script>
        <script src="~/lib/bootstrap/dist/js/bootstrap.js"></script>
        <script src="~/js/site.js" asp-append-version="true"></script>
    </environment>
    <environment exclude="Development">
        <script src="https://ajax.aspnetcdn.com/ajax/jquery/jquery-3.3.1.min.js"
                asp-fallback-src="~/lib/jquery/dist/jquery.min.js"
                asp-fallback-test="window.jQuery"
                crossorigin="anonymous"
                integrity="sha384-K+ctZQ+LL8q6tP7I94W+qzQsfRV2a+AfHIi9k8z8l9ggpc8X+Ytst4yBo/hH+8Fk">
        </script>
        <script src="https://ajax.aspnetcdn.com/ajax/bootstrap/3.3.7/bootstrap.min.js"
                asp-fallback-src="~/lib/bootstrap/dist/js/bootstrap.min.js"
                asp-fallback-test="window.jQuery && window.jQuery.fn && window.jQuery.fn.modal"
                crossorigin="anonymous"
                integrity="sha384-Tc5IQib027qvyjSMfHjOMaLkfuWVxZxUPnCJA7l2mCWNIpG9mGCD8wGNIcPD7Txa">
        </script>
        <script src="~/js/site.min.js" asp-append-version="true"></script>
    </environment>

    @RenderSection("Scripts", required: false)
</body>
</html>
  • Pages/shared/_LoginPartial cshtml文件移动到Views/shared/_LoginPartial。 cshtml

区域/标识/IdentityHostingStartup中配置标识。有关详细信息,请参阅 IHostingStartup。

生成的标识数据库代码需要Entity Framework Core 迁移创建迁移并更新数据库。例如,运行以下命令:

在 Visual Studio包管理器控制台中:

Install-Package Microsoft.AspNetCore.Diagnostics.EntityFrameworkCore
Add-Migration CreateIdentitySchema
Update-Database
dotnet ef migrations add CreateIdentitySchema
dotnet ef database update

Add-Migration 命令的 "CreateIdentitySchema" name 参数是任意的。"CreateIdentitySchema" 介绍迁移。

UseStaticFiles后调用UseAuthentication

public class Startup
{

    public void ConfigureServices(IServiceCollection services)
    {
        services.AddMvc();
    }

    public void Configure(IApplicationBuilder app, IHostingEnvironment env)
    {
        if (env.IsDevelopment())
        {
            app.UseDeveloperExceptionPage();
        }
        else
        {
            app.UseExceptionHandler("/Home/Error");
            app.UseHsts();
        }

        app.UseHttpsRedirection();
        app.UseStaticFiles();
        app.UseAuthentication();
        app.UseMvcWithDefaultRoute();
    }
}

建议 UseHsts,但不是必需的。有关详细信息,请参阅HTTP 严格传输安全协议

使用授权将标识基架到 MVC 项目Scaffold identity into an MVC project with authorization

运行标识 scaffolder:

  • 解决方案资源管理器中,右键单击项目 >添加> 新的基架项
  • 在 "添加基架" 对话框的左窗格中,选择 "标识" > "添加"。
  • 在 "添加标识" 对话框中,选择所需的选项。
    • 选择现有的布局页,否则将用错误的标记覆盖你的布局文件。选择现有 _布局 cshtml文件时,会覆盖它。

例如: MVC 项目的 Razor Pages ~/Views/Shared/_Layout.cshtml~/Pages/Shared/_Layout.cshtml

  • 若要使用现有的数据上下文,请至少选择一个要重写的文件。必须至少选择一个文件以添加数据上下文。
    • 选择数据上下文类。
    • 选择 添加
  • 创建新的用户上下文,并可能为标识创建自定义用户类:
    • 选择 " + " 按钮以创建新的数据上下文类
    • 选择 添加

注意:如果要创建新的用户上下文,则无需选择要重写的文件。

如果以前未安装 ASP.NET Core 基架,请立即进行安装:

dotnet tool install -g dotnet-aspnet-codegenerator

将所需的 NuGet 包引用添加到项目(*.csproj)文件中。在项目目录中运行以下命令:

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

运行以下命令以列出标识基架选项:

dotnet aspnet-codegenerator identity -h

如果出现基架错误,请验证目标框架名字对象 (TFM) 是否与项目文件中的 NuGet 包版本相匹配。例如,以下项目文件包含适用于 .NET Core 的版本 3.1 和所列的 NuGet 包:

<Project Sdk="Microsoft.NET.Sdk.Web">

  <PropertyGroup>
    <TargetFramework>netcoreapp3.1</TargetFramework>
  </PropertyGroup>

  <ItemGroup>
    <PackageReference Include="Microsoft.AspNetCore.Diagnostics.EntityFrameworkCore" Version="3.1.0" />
    <PackageReference Include="Microsoft.AspNetCore.Identity.EntityFrameworkCore" Version="3.1.0" />
    <PackageReference Include="Microsoft.AspNetCore.Identity.UI" Version="3.1.0" />
    <PackageReference Include="Microsoft.EntityFrameworkCore.Design" Version="3.1.0" />
    <PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer" Version="3.1.0" />
    <PackageReference Include="Microsoft.EntityFrameworkCore.Tools" Version="3.1.0" />
    <PackageReference Include="Microsoft.VisualStudio.Web.CodeGeneration.Design" Version="3.1.0" />
  </ItemGroup>

</Project>

在项目文件夹中,运行具有所需选项的标识 scaffolder。例如,若要设置默认 UI 和最小文件数的标识,请运行以下命令。为数据库上下文使用正确的完全限定名:

dotnet aspnet-codegenerator identity -dc MyWeb.Data.ApplicationDbContext --files "Account.Register;Account.Login"

PowerShell 使用分号作为命令分隔符。使用 PowerShell 时,请在文件列表中转义分号,或将文件列表置于双引号中。例如:

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

如果在未指定 —files 标志或 —useDefaultUI 标志的情况下运行标识 scaffolder,则会在项目中创建所有可用的标识 UI 页。

运行标识 scaffolder:

  • 解决方案资源管理器中,右键单击项目 >添加> 新的基架项
  • 在 "添加基架" 对话框的左窗格中,选择 "标识" > "添加"。
  • 在 "添加标识" 对话框中,选择所需的选项。
    • 选择现有的布局页,否则将用错误的标记覆盖你的布局文件。选择现有 _布局 cshtml文件时,会覆盖它。

例如: MVC 项目的 Razor Pages ~/Views/Shared/_Layout.cshtml~/Pages/Shared/_Layout.cshtml

  • 若要使用现有的数据上下文,请至少选择一个要重写的文件。必须至少选择一个文件以添加数据上下文。
    • 选择数据上下文类。
    • 选择 添加
  • 创建新的用户上下文,并可能为标识创建自定义用户类:
    • 选择 " + " 按钮以创建新的数据上下文类
    • 选择 添加

注意:如果要创建新的用户上下文,则无需选择要重写的文件。

如果以前未安装 ASP.NET Core 基架,请立即进行安装:

dotnet tool install -g dotnet-aspnet-codegenerator

将对VisualStudio的包引用添加到项目(*.csproj)文件中。在项目目录中运行以下命令:

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

运行以下命令以列出标识基架选项:

dotnet aspnet-codegenerator identity -h

在项目文件夹中,运行具有所需选项的标识 scaffolder。例如,若要设置默认 UI 和最小文件数的标识,请运行以下命令。为数据库上下文使用正确的完全限定名:

dotnet aspnet-codegenerator identity -dc MyWeb.Data.ApplicationDbContext --files "Account.Register;Account.Login"

PowerShell 使用分号作为命令分隔符。使用 PowerShell 时,请在文件列表中转义分号,或将文件列表置于双引号中。例如:

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

如果在未指定 —files 标志或 —useDefaultUI 标志的情况下运行标识 scaffolder,则会在项目中创建所有可用的标识 UI 页。

删除页面/共享文件夹和该文件夹中的文件。

创建完全标识 UI 源Create full identity UI source

若要保持对标识 UI 的完全控制,请运行标识 scaffolder,并选择 "替代所有文件"。

以下突出显示的代码显示默认标识 UI 替换标识在 ASP.NET Core 2.1 web 应用的更改。你可能希望执行此操作以对标识 UI 具有完全控制。

public void ConfigureServices(IServiceCollection services)
{
    services.Configure<CookiePolicyOptions>(options =>
    {
        options.CheckConsentNeeded = context => true;
        options.MinimumSameSitePolicy = SameSiteMode.None;
    });

    services.AddDbContext<ApplicationDbContext>(options =>
        options.UseSqlServer(
            Configuration.GetConnectionString("DefaultConnection")));

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

    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>();
}

在以下代码中,将替换默认标识:

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

下面的代码将设置LoginPathLogoutPathAccessDeniedPath

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

注册 IEmailSender 实现,例如:

// using Microsoft.AspNetCore.Identity.UI.Services;
services.AddSingleton<IEmailSender, EmailSender>();
public class EmailSender : IEmailSender
{
    public Task SendEmailAsync(string email, string subject, string message)
    {
        return Task.CompletedTask;
    }
}

禁用注册页Disable register page

禁用用户注册:

  • 基架标识。包括帐户. Register、RegisterConfirmation。例如:
dotnet aspnet-codegenerator identity -dc RPauth.Data.ApplicationDbContext --files "Account.Register;Account.Login;Account.RegisterConfirmation"
  • 更新区域/标识/页/帐户/注册. .cs ,使用户无法从此终结点注册:
public class RegisterModel : PageModel
{
    public IActionResult OnGet()
    {
        return RedirectToPage("Login");
    }

    public IActionResult OnPost()
    {
        return RedirectToPage("Login");
    }
}
  • 更新区域/标识/页/帐户/Register. cshtml ,使其与前面的更改一致:
@page
@model RegisterModel
@{
    ViewData["Title"] = "Go to Login";
}

<h1>@ViewData["Title"]</h1>

<li class="nav-item">
    <a class="nav-link text-dark" asp-area="Identity" asp-page="/Account/Login">Login</a>
</li>
  • 注释掉或删除区域/标识/页面/帐户/登录名中的注册链接
@*
<p>
    <a asp-page="./Register" asp-route-returnUrl="@Model.ReturnUrl">Register as a new user</a>
</p>
*@
  • 更新Areas/Identity/Pages/Account/RegisterConfirmation页。

    • 删除来自 cshtml 文件的代码和链接。
    • PageModel中删除确认代码:
[AllowAnonymous]
  public class RegisterConfirmationModel : PageModel
  {
      public IActionResult OnGet()
      {  
          return Page();
      }
  }

使用其他应用添加用户Use another app to add users

提供一种在 web 应用外部添加用户的机制。用于添加用户的选项包括:

  • 专用的管理 web 应用。
  • 控制台应用。

下面的代码概述了一种添加用户的方法:

  • 用户列表将读入内存中。
  • 为每个用户生成一个强唯一密码。
  • 用户已添加到标识数据库。
  • 系统会通知用户并通知用户更改密码。
public class Program
{
    public static void Main(string[] args)
    {
        var host = CreateHostBuilder(args).Build();

        using (var scope = host.Services.CreateScope())
        {
            var services = scope.ServiceProvider;

            try
            {
                var context = services.GetRequiredService<AppDbCntx>();
                context.Database.Migrate();

                var config = host.Services.GetRequiredService<IConfiguration>();
                var userList = config.GetSection("userList").Get<List<string>>();

                SeedData.Initialize(services, userList).Wait();
            }
            catch (Exception ex)
            {
                var logger = services.GetRequiredService<ILogger<Program>>();
                logger.LogError(ex, "An error occurred adding users.");
            }
        }

        host.Run();
    }

    public static IHostBuilder CreateHostBuilder(string[] args) =>
        Host.CreateDefaultBuilder(args)
            .ConfigureWebHostDefaults(webBuilder =>
            {
                webBuilder.UseStartup<Startup>();
            });
}

下面的代码概述了如何添加用户:


public static async Task Initialize(IServiceProvider serviceProvider,
                                    List<string> userList)
{
    var userManager = serviceProvider.GetService<UserManager<IdentityUser>>();

    foreach (var userName in userList)
    {
        var userPassword = GenerateSecurePassword();
        var userId = await EnsureUser(userManager, userName, userPassword);

        NotifyUser(userName, userPassword);
    }
}

private static async Task<string> EnsureUser(UserManager<IdentityUser> userManager,
                                             string userName, string userPassword)
{
    var user = await userManager.FindByNameAsync(userName);

    if (user == null)
    {
        user = new IdentityUser(userName)
        {
            EmailConfirmed = true
        };
        await userManager.CreateAsync(user, userPassword);
    }

    return user.Id;
}

对于生产方案,可以遵循类似的方法。

其他资源Additional resources