扩展此问题的答案: Change routing in ASP.NET Core Identity UI?
Javier建议您选择以下选项之一 自定义网址:
- 使用默认UI的scaffolding元素,然后自行进行所有必要的自定义。
- 使用重定向规则,将旧路由指向新路由。
- 完全不使用默认用户界面。
在新的ASP.NET Core 2.1 MVC项目中,设置了“身份验证:个人用户帐户”后,如何不使用默认UI?默认情况下,它似乎已与Identity Core一起安装。
创建项目后,如何删除“默认UI”剃须刀页面并仍然使用Identity Core?
我可以只删除void validateUserName(String name){
if(!VALID_NAME.equals(name){
throw new BadNameException();
}
}
区域,而是创建自己的/Identity/
吗?
答案 0 :(得分:14)
使用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
,则可以覆盖默认设置。即不要包含.AddDefaultUI()
(也不要搭建UI),并且您可以编写自己的UI。
services.AddIdentity<IdentityUser, IdentityRole>(options => options.Stores.MaxLengthForKeys = 128)
.AddEntityFrameworkStores<ApplicationDbContext>()
// .AddDefaultUI()
.AddDefaultTokenProviders();
然后,我认为删除/Areas/Identity/
文件夹是安全的,但我不是100%
更新:
我整理了答案,以详细说明最终的解决方案,以删除ASP.NET Core 2.1附带的默认标识UI剃须刀页面,并改用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”),并在项目创建窗口中选择Individual User Account
身份验证。
4)将AccountController
和ManageController
以及相应的ViewModels
和Views
从2.0项目复制到ASP.NET Core 2.1项目。
执行上述操作,到目前为止,我还没有遇到任何问题。
答案 1 :(得分:2)
我赞成第一个答案,因为它使我有90%的答案,我想把其余的答案全部放弃(发表评论的时间太长了)。因此,您希望保留该/ Areas / Identity /文件夹,因为如果您正巧使用默认模板中的标头,则它指向共享文件夹,如果没有关系,请将其删除。后端仍将指向Identity/Account/Register/
,因此创建一个名为Account
的控制器,并在一个名为Account
的视图中创建一个文件夹,然后将Register.cshtml
放入文件夹中。我从调试器窗口中获取了原始的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?}");
答案 2 :(得分:1)
有点晚了,但是有一种更简单的方法可以做到。您可以添加新的脚手架以覆盖所有内容。查看这篇文章enter link description here