ASP.NET Core 2.1 Identity:如何删除默认 UI razor 页面?
ASP.NET Core 2.1 Identity: How to remove the Default UI razor pages?
扩展这个问题的答案:
Javier recommends one of the following options when wanting to
customise the URLs:
- Use the scaffolding element of the Default UI and make all necessary customisations yourself.
- Use a redirection rule that points the old routes to the new routes.
- Don't use the Default UI at all.
来自一个新的 ASP.NET 核心 2.1 MVC 项目,设置了身份验证:个人用户帐户,你怎么不使用默认 UI?它似乎默认与 Identity Core 一起安装。
项目创建后,有什么方法可以去掉Default UI razor pages,仍然使用Identity Core?
我可以只删除 /Identity/
区域,然后创建自己的 AccountController
区域吗?
使用 the article linked by Panagiotis Kanavos,我找到了解决方案。
在 ASP.NET Core 2.1.0-preview1 中,有一行 .AddDefaultUI()
,您不必将其包含在 Startup.cs
中。
services.AddIdentity<IdentityUser, IdentityRole>(options => options.Stores.MaxLengthForKeys = 128)
.AddEntityFrameworkStores<ApplicationDbContext>()
.AddDefaultUI()
.AddDefaultTokenProviders();
然而,在 Core 2.1 的最终发布版本中,同一部分被简化为:
services.AddDefaultIdentity<IdentityUser>()
.AddEntityFrameworkStores<ApplicationDbContext>();
解决方案,如果您将 AddDefaultIdentity
改回 AddIdentity
,您可以覆盖默认值。 IE。不要包含 .AddDefaultUI()
(也不要搭建 UI 的脚手架),您可以自己编写。
services.AddIdentity<IdentityUser, IdentityRole>(options => options.Stores.MaxLengthForKeys = 128)
.AddEntityFrameworkStores<ApplicationDbContext>()
// .AddDefaultUI()
.AddDefaultTokenProviders();
然后,我认为删除/Areas/Identity/
文件夹是安全的,但我不是100%
更新:
我清理了我的答案以详细说明我最终采用的最终解决方案,以删除 ASP.NET Core 2.1 附带的默认身份 UI razor 页面并改用 MVC。
1) 在Startup.cs
,
public void ConfigureServices(IServiceCollection services)
{
// Unrelated stuff commented out...
// BEGIN: Identity Setup (Overrides default identity)
services.AddIdentity<ApplicationUser, IdentityRole>(options => options.Stores.MaxLengthForKeys = 128)
.AddEntityFrameworkStores<ApplicationDbContext>()
.AddDefaultTokenProviders();
// END: Identity Setup
services.Configure<IdentityOptions>(options =>
{
// Set your identity Settings here (password length, etc.)
});
// More unrelated stuff commented out...
services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
// Added after AddMvc()
services.ConfigureApplicationCookie(options =>
{
options.LoginPath = $"/account/login";
options.LogoutPath = $"/account/logout";
options.AccessDeniedPath = $"/account/access-denied";
});
// More unrelated stuff commented out...
}
显然,如果需要,请将 ApplicationUser
和 IdentityRole
替换为您自己的 类。
2) 删除 ASP.NET Core 2.1 项目默认的 Identity 区域文件夹。
3) 创建一个新的单独的 ASP.NET Core 2.0 项目(不是“2.1”),在项目创建 window 中选择 Individual User Account
身份验证。
4) 将 AccountController
和 ManageController
以及相应的 ViewModels
和 Views
从 2.0 项目复制到您的 ASP.NET Core 2.1 项目.
通过以上操作,到目前为止我还没有 运行 遇到任何问题。
我对第一个答案投了赞成票,因为它让我获得了 90% 的赞成率,我想给出其余的答案(发表评论有点太长了)。因此,您需要保留 /Areas/Identity/ 文件夹,因为如果您碰巧使用默认模板中的 header,它会指向您的共享文件夹,如果不是,也不要紧,将其删除。后端仍将指向 Identity/Account/Register/
,因此创建一个名为 Account
的控制器,在名为 Account
的视图中创建一个文件夹并放置 Register.cshtml
。我从调试器 window 中获取了原始 html,您可以将其用作自定义模板。放入 Register.cshtml:
<div class="container body-content">
<h2>Register</h2>
<div class="row">
<div class="col-md-4">
<form method="post" action="/Identity/Account/Register" novalidate="novalidate">
<h4>Create a new account.</h4>
<hr>
<div class="text-danger validation-summary-valid" data-valmsg-summary="true"><ul><li style="display:none"></li>
</ul></div>
<div class="form-group">
<label for="Input_Email">Email</label>
<input class="form-control" type="email" data-val="true" data-val-email="The Email field is not a valid e-mail address." data-val-required="The Email field is required." id="Input_Email" name="Input.Email" value="">
<span class="text-danger field-validation-valid" data-valmsg-for="Input.Email" data-valmsg-replace="true"></span>
</div>
<div class="form-group">
<label for="Input_Password">Password</label>
<input class="form-control" type="password" data-val="true" data-val-length="The Password must be at least 6 and at max 100 characters long." data-val-length-max="100" data-val-length-min="6" data-val-required="The Password field is required." id="Input_Password" name="Input.Password">
<span class="text-danger field-validation-valid" data-valmsg-for="Input.Password" data-valmsg-replace="true"></span>
</div>
<div class="form-group">
<label for="Input_ConfirmPassword">Confirm password</label>
<input class="form-control" type="password" data-val="true" data-val-equalto="The password and confirmation password do not match." data-val-equalto-other="*.Password" id="Input_ConfirmPassword" name="Input.ConfirmPassword">
<span class="text-danger field-validation-valid" data-valmsg-for="Input.ConfirmPassword" data-valmsg-replace="true"></span>
</div>
<button type="submit" class="btn btn-default">Register</button>
<input name="__RequestVerificationToken" type="hidden" value="CfDJ8IWbPHM_NTJDv_7HGewWzbbRveP09yQOznYdTWL2aN5X_4_eVbNE1w8D_qz7zegloVtdAhuVOJbJLQo0ja73FB3PgYycyGpn-DfX3fJqv4Cx8ns6Ygh6M7nMxV0eozO7hoDxUfPwrIJb2RcFtyzhPpMevZ4P0M8aVyBP55SP-5C4l23dCtDXXUOAY_YLwt67dw"></form>
</div>
</div>
<hr>
<footer>
<p>© 2018 - SqlServerApp</p>
</footer>
</div>
就像其他答案所说的那样,改变启动:
services.AddIdentity<IdentityUser, IdentityRole>(options => options.Stores.MaxLengthForKeys = 128)
.AddEntityFrameworkStores<ApplicationDbContext>()
// .AddDefaultUI()
.AddDefaultTokenProviders();
还必须创建到您的控制器的路由,相同的 Startup.cs 文件,保留其中的另一条路由,现在我想到它可能首先保留它,因为它会按顺序检查它们:
app.UseMvc(routes =>
{
routes.MapRoute(
name: "identity",
template: "Identity/{controller=Account}/{action=Register}/{id?}");
有点晚了,但有一种更简单的方法。您可以添加新的脚手架来覆盖所有内容。查看 this article。
扩展这个问题的答案:
Javier recommends one of the following options when wanting to customise the URLs:
- Use the scaffolding element of the Default UI and make all necessary customisations yourself.
- Use a redirection rule that points the old routes to the new routes.
- Don't use the Default UI at all.
来自一个新的 ASP.NET 核心 2.1 MVC 项目,设置了身份验证:个人用户帐户,你怎么不使用默认 UI?它似乎默认与 Identity Core 一起安装。
项目创建后,有什么方法可以去掉Default UI razor pages,仍然使用Identity Core?
我可以只删除 /Identity/
区域,然后创建自己的 AccountController
区域吗?
使用 the article linked by Panagiotis Kanavos,我找到了解决方案。
在 ASP.NET Core 2.1.0-preview1 中,有一行 .AddDefaultUI()
,您不必将其包含在 Startup.cs
中。
services.AddIdentity<IdentityUser, IdentityRole>(options => options.Stores.MaxLengthForKeys = 128)
.AddEntityFrameworkStores<ApplicationDbContext>()
.AddDefaultUI()
.AddDefaultTokenProviders();
然而,在 Core 2.1 的最终发布版本中,同一部分被简化为:
services.AddDefaultIdentity<IdentityUser>()
.AddEntityFrameworkStores<ApplicationDbContext>();
解决方案,如果您将 AddDefaultIdentity
改回 AddIdentity
,您可以覆盖默认值。 IE。不要包含 .AddDefaultUI()
(也不要搭建 UI 的脚手架),您可以自己编写。
services.AddIdentity<IdentityUser, IdentityRole>(options => options.Stores.MaxLengthForKeys = 128)
.AddEntityFrameworkStores<ApplicationDbContext>()
// .AddDefaultUI()
.AddDefaultTokenProviders();
然后,我认为删除/Areas/Identity/
文件夹是安全的,但我不是100%
更新:
我清理了我的答案以详细说明我最终采用的最终解决方案,以删除 ASP.NET Core 2.1 附带的默认身份 UI razor 页面并改用 MVC。
1) 在Startup.cs
,
public void ConfigureServices(IServiceCollection services)
{
// Unrelated stuff commented out...
// BEGIN: Identity Setup (Overrides default identity)
services.AddIdentity<ApplicationUser, IdentityRole>(options => options.Stores.MaxLengthForKeys = 128)
.AddEntityFrameworkStores<ApplicationDbContext>()
.AddDefaultTokenProviders();
// END: Identity Setup
services.Configure<IdentityOptions>(options =>
{
// Set your identity Settings here (password length, etc.)
});
// More unrelated stuff commented out...
services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
// Added after AddMvc()
services.ConfigureApplicationCookie(options =>
{
options.LoginPath = $"/account/login";
options.LogoutPath = $"/account/logout";
options.AccessDeniedPath = $"/account/access-denied";
});
// More unrelated stuff commented out...
}
显然,如果需要,请将 ApplicationUser
和 IdentityRole
替换为您自己的 类。
2) 删除 ASP.NET Core 2.1 项目默认的 Identity 区域文件夹。
3) 创建一个新的单独的 ASP.NET Core 2.0 项目(不是“2.1”),在项目创建 window 中选择 Individual User Account
身份验证。
4) 将 AccountController
和 ManageController
以及相应的 ViewModels
和 Views
从 2.0 项目复制到您的 ASP.NET Core 2.1 项目.
通过以上操作,到目前为止我还没有 运行 遇到任何问题。
我对第一个答案投了赞成票,因为它让我获得了 90% 的赞成率,我想给出其余的答案(发表评论有点太长了)。因此,您需要保留 /Areas/Identity/ 文件夹,因为如果您碰巧使用默认模板中的 header,它会指向您的共享文件夹,如果不是,也不要紧,将其删除。后端仍将指向 Identity/Account/Register/
,因此创建一个名为 Account
的控制器,在名为 Account
的视图中创建一个文件夹并放置 Register.cshtml
。我从调试器 window 中获取了原始 html,您可以将其用作自定义模板。放入 Register.cshtml:
<div class="container body-content">
<h2>Register</h2>
<div class="row">
<div class="col-md-4">
<form method="post" action="/Identity/Account/Register" novalidate="novalidate">
<h4>Create a new account.</h4>
<hr>
<div class="text-danger validation-summary-valid" data-valmsg-summary="true"><ul><li style="display:none"></li>
</ul></div>
<div class="form-group">
<label for="Input_Email">Email</label>
<input class="form-control" type="email" data-val="true" data-val-email="The Email field is not a valid e-mail address." data-val-required="The Email field is required." id="Input_Email" name="Input.Email" value="">
<span class="text-danger field-validation-valid" data-valmsg-for="Input.Email" data-valmsg-replace="true"></span>
</div>
<div class="form-group">
<label for="Input_Password">Password</label>
<input class="form-control" type="password" data-val="true" data-val-length="The Password must be at least 6 and at max 100 characters long." data-val-length-max="100" data-val-length-min="6" data-val-required="The Password field is required." id="Input_Password" name="Input.Password">
<span class="text-danger field-validation-valid" data-valmsg-for="Input.Password" data-valmsg-replace="true"></span>
</div>
<div class="form-group">
<label for="Input_ConfirmPassword">Confirm password</label>
<input class="form-control" type="password" data-val="true" data-val-equalto="The password and confirmation password do not match." data-val-equalto-other="*.Password" id="Input_ConfirmPassword" name="Input.ConfirmPassword">
<span class="text-danger field-validation-valid" data-valmsg-for="Input.ConfirmPassword" data-valmsg-replace="true"></span>
</div>
<button type="submit" class="btn btn-default">Register</button>
<input name="__RequestVerificationToken" type="hidden" value="CfDJ8IWbPHM_NTJDv_7HGewWzbbRveP09yQOznYdTWL2aN5X_4_eVbNE1w8D_qz7zegloVtdAhuVOJbJLQo0ja73FB3PgYycyGpn-DfX3fJqv4Cx8ns6Ygh6M7nMxV0eozO7hoDxUfPwrIJb2RcFtyzhPpMevZ4P0M8aVyBP55SP-5C4l23dCtDXXUOAY_YLwt67dw"></form>
</div>
</div>
<hr>
<footer>
<p>© 2018 - SqlServerApp</p>
</footer>
</div>
就像其他答案所说的那样,改变启动:
services.AddIdentity<IdentityUser, IdentityRole>(options => options.Stores.MaxLengthForKeys = 128)
.AddEntityFrameworkStores<ApplicationDbContext>()
// .AddDefaultUI()
.AddDefaultTokenProviders();
还必须创建到您的控制器的路由,相同的 Startup.cs 文件,保留其中的另一条路由,现在我想到它可能首先保留它,因为它会按顺序检查它们:
app.UseMvc(routes =>
{
routes.MapRoute(
name: "identity",
template: "Identity/{controller=Account}/{action=Register}/{id?}");
有点晚了,但有一种更简单的方法。您可以添加新的脚手架来覆盖所有内容。查看 this article。