ASP.NET Core 提供作为Razor 类库 ASP.NET Core 标识。 包含标识的应用程序可以应用 scaffolder 来有选择地添加标识 Razor 类库中包含的源代码(RCL)。 建议生成源代码,以便修改代码和更改行为。 例如,可以指示基架生成在注册过程中使用的代码。 生成的代码优先于标识 RCL 中的相同代码。 若要完全控制 UI,而不使用默认的 RCL,请参阅创建完全标识 UI 源部分。
不包含身份验证的应用程序可以应用 scaffolder 来添加 RCL 标识包。 可以选择要生成的标识代码。
尽管 scaffolder 生成了大部分必要的代码,但你需要更新项目以完成该过程。 本文档介绍完成标识基架更新所需的步骤。
建议使用显示文件差异的源代码管理系统,并使您能够回退更改。 运行标识 scaffolder 后检查更改。
使用双重身份验证、帐户确认和密码恢复,以及使用标识的其他安全功能时,需要提供服务。 基架标识时不生成服务或服务存根。 要启用这些功能,必须手动添加服务。 例如,请参阅需要确认电子邮件。
本文档包含的详细说明比在运行 scaffolder 时生成的ScaffoldingReadme文件更完整。
运行标识 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 Startup(IConfiguration configuration) { Configuration = configuration; } public IConfiguration Configuration { get; } public void ConfigureServices(IServiceCollection services) { services.AddDbContext<ApplicationDbContext>(options => options.UseSqlServer( Configuration.GetConnectionString("DefaultConnection"))); services.AddDefaultIdentity<IdentityUser>(options => options.SignIn.RequireConfirmedAccount = true) .AddEntityFrameworkStores<ApplicationDbContext>(); services.AddControllersWithViews(); services.AddRazorPages(); } public void Configure(IApplicationBuilder app, IWebHostEnvironment env) { if (env.IsDevelopment()) { app.UseDeveloperExceptionPage(); app.UseDatabaseErrorPage(); } else { app.UseExceptionHandler("/Home/Error"); app.UseHsts(); } app.UseHttpsRedirection(); app.UseStaticFiles(); app.UseRouting(); app.UseAuthentication(); app.UseAuthorization(); app.UseEndpoints(endpoints => { endpoints.MapControllerRoute( name: "default", pattern: "{controller=Home}/{action=Index}/{id?}"); endpoints.MapRazorPages(); }); } }
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"
介绍迁移。
运行标识 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。
生成的标识数据库代码需要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"
介绍迁移。
用类似于下面的代码更新 Startup
类:
public class Startup { public Startup(IConfiguration configuration) { Configuration = configuration; } public IConfiguration Configuration { get; } public void ConfigureServices(IServiceCollection services) { services.AddDbContext<ApplicationDbContext>(options => options.UseSqlServer( Configuration.GetConnectionString("DefaultConnection"))); services.AddDefaultIdentity<IdentityUser>(options => options.SignIn.RequireConfirmedAccount = true) .AddEntityFrameworkStores<ApplicationDbContext>(); services.AddRazorPages(); } public void Configure(IApplicationBuilder app, IWebHostEnvironment env) { if (env.IsDevelopment()) { app.UseDeveloperExceptionPage(); app.UseDatabaseErrorPage(); } else { app.UseExceptionHandler("/Error"); app.UseHsts(); } app.UseHttpsRedirection(); app.UseStaticFiles(); app.UseRouting(); app.UseAuthentication(); app.UseAuthorization(); app.UseEndpoints(endpoints => { endpoints.MapRazorPages(); }); } }
UseHsts
建议但不是必需的。 请参阅HTTP 严格传输安全性协议有关详细信息。
可选:将登录名部分(_LoginPartial
)添加到布局文件中:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <title>@ViewData["Title"] - WebRP</title> <link rel="stylesheet" href="~/lib/bootstrap/dist/css/bootstrap.min.css" /> <link rel="stylesheet" href="~/css/site.css" /> </head> <body> <header> <nav class="navbar navbar-expand-sm navbar-toggleable-sm navbar-light bg-white border-bottom box-shadow mb-3"> <div class="container"> <a class="navbar-brand" asp-area="" asp-page="/Index">WebRP</a> <button class="navbar-toggler" type="button" data-toggle="collapse" data-target=".navbar-collapse" aria-controls="navbarSupportedContent" aria-expanded="false" aria-label="Toggle navigation"> <span class="navbar-toggler-icon"></span> </button> <div class="navbar-collapse collapse d-sm-inline-flex flex-sm-row-reverse"> <partial name="_LoginPartial" /> <ul class="navbar-nav flex-grow-1"> <li class="nav-item"> <a class="nav-link text-dark" asp-area="" asp-page="/Index">Home</a> </li> <li class="nav-item"> <a class="nav-link text-dark" asp-area="" asp-page="/Privacy">Privacy</a> </li> </ul> </div> </div> </nav> </header> <div class="container"> <main role="main" class="pb-3"> @RenderBody() </main> </div> <footer class="border-top footer text-muted"> <div class="container"> © 2019 - WebRP - <a asp-area="" asp-page="/Privacy">Privacy</a> </div> </footer> <script src="~/lib/jquery/dist/jquery.min.js"></script> <script src="~/lib/bootstrap/dist/js/bootstrap.bundle.min.js"></script> <script src="~/js/site.js" asp-append-version="true"></script> @RenderSection("Scripts", required: false) </body> </html>
运行标识 scaffolder:
例如: 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:
例如: 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。
运行标识 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 lang="en"> <head> <meta charset="utf-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <title>@ViewData["Title"] - WebRP</title> <link rel="stylesheet" href="~/lib/bootstrap/dist/css/bootstrap.min.css" /> <link rel="stylesheet" href="~/css/site.css" /> </head> <body> <header> <nav class="navbar navbar-expand-sm navbar-toggleable-sm navbar-light bg-white border-bottom box-shadow mb-3"> <div class="container"> <a class="navbar-brand" asp-area="" asp-page="/Index">WebRP</a> <button class="navbar-toggler" type="button" data-toggle="collapse" data-target=".navbar-collapse" aria-controls="navbarSupportedContent" aria-expanded="false" aria-label="Toggle navigation"> <span class="navbar-toggler-icon"></span> </button> <div class="navbar-collapse collapse d-sm-inline-flex flex-sm-row-reverse"> <partial name="_LoginPartial" /> <ul class="navbar-nav flex-grow-1"> <li class="nav-item"> <a class="nav-link text-dark" asp-area="" asp-page="/Index">Home</a> </li> <li class="nav-item"> <a class="nav-link text-dark" asp-area="" asp-page="/Privacy">Privacy</a> </li> </ul> </div> </div> </nav> </header> <div class="container"> <main role="main" class="pb-3"> @RenderBody() </main> </div> <footer class="border-top footer text-muted"> <div class="container"> © 2019 - WebRP - <a asp-area="" asp-page="/Privacy">Privacy</a> </div> </footer> <script src="~/lib/jquery/dist/jquery.min.js"></script> <script src="~/lib/bootstrap/dist/js/bootstrap.bundle.min.js"></script> <script src="~/js/site.js" asp-append-version="true"></script> @RenderSection("Scripts", required: false) </body> </html>
在区域/标识/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"
介绍迁移。
用类似于下面的代码更新 Startup
类:
public class Startup { public Startup(IConfiguration configuration) { Configuration = configuration; } public IConfiguration Configuration { get; } public void ConfigureServices(IServiceCollection services) { services.AddDbContext<ApplicationDbContext>(options => options.UseSqlServer( Configuration.GetConnectionString("DefaultConnection"))); services.AddDefaultIdentity<IdentityUser>(options => options.SignIn.RequireConfirmedAccount = true) .AddEntityFrameworkStores<ApplicationDbContext>(); services.AddControllersWithViews(); services.AddRazorPages(); } public void Configure(IApplicationBuilder app, IWebHostEnvironment env) { if (env.IsDevelopment()) { app.UseDeveloperExceptionPage(); app.UseDatabaseErrorPage(); } else { app.UseExceptionHandler("/Home/Error"); app.UseHsts(); } app.UseHttpsRedirection(); app.UseStaticFiles(); app.UseRouting(); app.UseAuthentication(); app.UseAuthorization(); app.UseEndpoints(endpoints => { endpoints.MapControllerRoute( name: "default", pattern: "{controller=Home}/{action=Index}/{id?}"); endpoints.MapRazorPages(); }); } }
UseHsts
建议但不是必需的。 请参阅HTTP 严格传输安全性协议有关详细信息。
运行标识 scaffolder:
例如: 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:
例如: 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 的完全控制,请运行标识 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();
下面的代码将设置LoginPath、 LogoutPath和AccessDeniedPath:
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; } }
禁用用户注册:
基架标识。 包括帐户. 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页。
PageModel
中删除确认代码:[AllowAnonymous] public class RegisterConfirmationModel : PageModel { public IActionResult OnGet() { return Page(); } }
提供一种在 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; }
对于生产方案,可以遵循类似的方法。
要阻止将静态标识资产发布到 Web 根目录,请参阅 ASP.NET Core 上的标识简介。
ASP.NET Core 2.1 及更高版本提供了ASP.NET Core 标识作为Razor 类库。 包含标识的应用程序可以应用 scaffolder 来有选择地添加标识 Razor 类库中包含的源代码(RCL)。 建议生成源代码,以便修改代码和更改行为。 例如,可以指示基架生成在注册过程中使用的代码。 生成的代码优先于标识 RCL 中的相同代码。 若要完全控制 UI,而不使用默认的 RCL,请参阅创建完全标识 UI 源部分。
不包含身份验证的应用程序可以应用 scaffolder 来添加 RCL 标识包。 可以选择要生成的标识代码。
尽管 scaffolder 生成了大部分必要的代码,但你必须更新项目才能完成此过程。 本文档介绍完成标识基架更新所需的步骤。
运行标识 scaffolder 时,会在项目目录中创建一个ScaffoldingReadme文件。 ScaffoldingReadme文件包含有关完成标识基架更新所需内容的一般说明。 本文档包含的有关ScaffoldingReadme文件的完整说明。
建议使用显示文件差异的源代码管理系统,并使您能够回退更改。 运行标识 scaffolder 后检查更改。
运行标识 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"
介绍迁移。
运行标识 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。
生成的标识数据库代码需要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"
介绍迁移。
在 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 严格传输安全性协议有关详细信息。
可选:将登录名部分(_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>© 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>
运行标识 scaffolder:
例如: 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:
例如: 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。
运行标识 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>© 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>
在区域/标识/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 严格传输安全性协议有关详细信息。
运行标识 scaffolder:
例如: 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:
例如: 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 的完全控制,请运行标识 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();
下面的代码将设置LoginPath、 LogoutPath和AccessDeniedPath:
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; } }
禁用用户注册:
基架标识。 包括帐户. 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页。
PageModel
中删除确认代码:[AllowAnonymous] public class RegisterConfirmationModel : PageModel { public IActionResult OnGet() { return Page(); } }
提供一种在 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; }
对于生产方案,可以遵循类似的方法。