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 中的证书身份验证实现

ASP.NET Core 3.1 Azure AD 身份验证引发 OptionsValidationException

使用 ADFS 的 JWT Bearer 身份验证将 ASP.NET Framework 迁移到 ASP.NET Core 3.1

如何在 ASP.NET Core 3.1 中启用多重身份验证?

带有 Windows 身份验证的 ASP.Net Core 3.1 中的空闲超时