ASP.Net Core 3.1 脚手架的身份页面并未全部使用(即登录页面正常,注册页面不正常)......为啥?
Posted
技术标签:
【中文标题】ASP.Net Core 3.1 脚手架的身份页面并未全部使用(即登录页面正常,注册页面不正常)......为啥?【英文标题】:ASP.Net Core 3.1 scaffolded Identity pages not all used (ie. Login page OK, Register page NOK)...why?ASP.Net Core 3.1 脚手架的身份页面并未全部使用(即登录页面正常,注册页面不正常)......为什么? 【发布时间】:2020-08-21 14:50:46 【问题描述】:我刚刚使用dotnet aspnet-codegenerator identity
工具成功搭建了身份页面,并在启动时添加了一些自定义代码来填充一些角色。
然后我想用一些代码更新/Areas/Identity/Pages/Register.cshtml.cs
文件,以向新创建的用户添加自定义角色...但是未到达此页面中的断点。
当我修改 Login.cshtml 的 HTML 时,没关系,我看到 .cs 文件中的更改和断点到达
当我尝试在 Register.cshtml 中做同样的事情时,没有考虑任何内容,自定义 HTML 没有更新,也永远不会到达断点
也许我错过了 Startup conf 中的某些内容?
编辑
如果我将 Register.cshtml/.cs 重命名为 Register2,我可以到达 /Identity/Account/Register 路径下的两个页面 和 /Identity/Account/Register2。
但是当定位到Register2
时,会到达断点并且 HTML 是最新的...
也许有IdentityHostingStartup
的隐藏链接?
这里是:
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;
)
.AddRoles<IdentityRole>()
.AddEntityFrameworkStores<ApplicationDbContext>();
services.AddAuthentication();
services.AddControllersWithViews();
services.AddMvc();
services.AddRazorPages();
public void Configure(IApplicationBuilder app, IWebHostEnvironment env, RoleManager<IdentityRole> roleManager, UserManager<IdentityUser> userManager)
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.MapControllers();
endpoints.MapRazorPages();
);
非常感谢朋友^^
【问题讨论】:
您是如何修改 Register.cshtml 和 Register.cshtml.cs 的? 我刚刚更改了 HTML 以查看如何编辑它.. 【参考方案1】:这是一个工作演示,说明如何向新创建的用户添加角色:
对于您的 Startup.cs,无需 DI UserManager 和 RoleManager:
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>()
.AddRoles<IdentityRole>()
.AddEntityFrameworkStores<ApplicationDbContext>();
services.AddAuthentication();
services.AddControllersWithViews();
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.MapControllerRoute(
name: "default",
pattern: "controller=Home/action=Index/id?");
endpoints.MapRazorPages();
);
对于Register.cshtml.cs:
public async Task<IActionResult> OnPostAsync(string returnUrl = null)
returnUrl = returnUrl ?? Url.Content("~/");
ExternalLogins = (await _signInManager.GetExternalAuthenticationSchemesAsync()).ToList();
if (ModelState.IsValid)
bool x = await _roleManager.RoleExistsAsync("Admin");
if (!x)
// first we create Admin role
var role = new IdentityRole();
role.Name = "Admin";
await _roleManager.CreateAsync(role);
var user = new ApplicationUser UserName = Input.Email, Email = Input.Email ;
var result = await _userManager.CreateAsync(user, Input.Password);
var data = await _userManager.AddToRoleAsync(user, "Admin");
if (result.Succeeded)
//...
return Page();
【讨论】:
谢谢,但不是我遇到的问题。我确实成功填充了角色和用户等。我的问题是,当我自定义登录页面的 HTML 时,我看到了结果,但是当我自定义注册页面时,看不到任何变化,似乎身份框架选择了什么服务°-° 有时它服务于脚手架页面,有时它似乎服务于一些 DLL 隐藏的页面......只是想知道为什么 那么您是如何更改 Register.cshtml 的?我建议您可以提供一些代码,然后我们可以帮助您。 嗨 Rena,我只更改了 Register.cshtml 页面中的一些 HTML 标签,只是为了看看我是否可以自定义渲染。我没有更改代码隐藏。无论如何,我想我会自己重新创建所有的身份页面,原因有两个: - 拥有自己的路线/结构 - 为注册和管理部分编写一些额外的规则 如果只是修改Register.cshtml中的html,就可以很好的渲染了。请问你是怎么修改的? 我知道这个问题已经存在几个月了。但是,我在 VS for Mac 中遇到了类似的问题,我正在拔头发。我能够解决它的唯一方法是从 Visual Studio 中删除 Register.cshtml 文件,然后将其作为现有文件重新添加并重建,此时我的更改可见,否则它似乎使用 Razor 类中的那个库 DLL。以上是关于ASP.Net Core 3.1 脚手架的身份页面并未全部使用(即登录页面正常,注册页面不正常)......为啥?的主要内容,如果未能解决你的问题,请参考以下文章
使用两个 JWT 身份验证方案,ASP.NET Core 3.1
ASP.NET Core 3.1 Azure AD 身份验证引发 OptionsValidationException
使用 ADFS 的 JWT Bearer 身份验证将 ASP.NET Framework 迁移到 ASP.NET Core 3.1