简体   繁体   English

无法导航到身份注销页面-ASP.Net Core 3.1-

[英]Can't Navigate to Identity Logout Page -ASP.Net Core 3.1-

I've been extending and modifying the IdentityUser class and have made the corresponing EntityFramework migrations adjustments the Database reflects the changes and I started up the site.我一直在扩展和修改 IdentityUser class,并进行了相应的 EntityFramework 迁移调整,数据库反映了这些更改,然后我启动了该站点。 What I found is that everywhere that is said IdentityUser previously had to be changed to the new User class (a child of IdentityUser).我发现,之前所说的 IdentityUser 的所有地方都必须更改为新用户 class(IdentityUser 的子级)。 I've made the changes which required some adjustments to the Startup.cs file.我进行了更改,需要对 Startup.cs 文件进行一些调整。 Now I can login but am unable to logout.现在我可以登录但无法注销。 It seem that my site has been completely locked out of the generated Razor pages in the "Identity" Area.似乎我的站点已完全被“身份”区域中生成的 Razor 个页面拒之门外。 So, here is my Startup.cs page maybe something is wrong in there.所以,这是我的 Startup.cs 页面,也许里面有问题。

namespace InTheCloud
{
    public class Startup
    {
        public Startup(IWebHostEnvironment env, IConfiguration configuration)
        {
            Configuration = configuration;
            _env = env;
        }

        public IConfiguration Configuration { get; }
        public string PublicClientId { get; private set; }
        private OAuthAuthorizationServerOptions OAuthOptions { get; set; }
        private readonly IWebHostEnvironment _env;

        // This method gets called by the runtime. Use this method to add services to the container.
        public void ConfigureServices(IServiceCollection services)
        {
            services.AddControllersWithViews().AddNewtonsoftJson();
            services.AddRazorPages();

            services.Configure<CookiePolicyOptions>(options =>
            {
                // This lambda determines whether user consent for non-essential cookies is needed for a given request.
                options.CheckConsentNeeded = context => true;
                options.MinimumSameSitePolicy = Microsoft.AspNetCore.Http.SameSiteMode.None;
            });

            services.AddDbContext<ApplicationDbContext>(options =>
                options.UseMySql(
                    Configuration.GetConnectionString("DefaultConnection")));

            services.AddScoped<ApplicationDbContext>();

            services.AddScoped<UserManager<User>>();

            services.AddTransient<IUserService, UserService>();
            //services.AddAutoMapper(AppDomain.CurrentDomain.GetAssemblies());

            services.AddIdentity<User, IdentityRole>(config => {
                config.SignIn.RequireConfirmedEmail = true;
                
                config.Tokens.ProviderMap.Add("CustomEmailConfirmation",
                    new TokenProviderDescriptor(
                        typeof(CustomEmailConfirmationTokenProvider<User>)));
                config.Tokens.EmailConfirmationTokenProvider = "CustomEmailConfirmation";
            }).AddEntityFrameworkStores<ApplicationDbContext>().AddDefaultTokenProviders();

            // Add a DbContext to store your Database Keys
            services.AddDbContext<MyKeysContext>(options =>
                options.UseMySql(
                    Configuration.GetConnectionString("MyKeysContext")));

            // using Microsoft.AspNetCore.DataProtection;
            services.AddDataProtection()
                .PersistKeysToDbContext<MyKeysContext>();
           
            services.AddScoped<Services.AppVariables>();

            services.AddHttpsRedirection(options =>
            {
                //options.RedirectStatusCode = StatusCodes.Status100Continue;
                options.HttpsPort = 5000;

            });

            services.AddHsts(options =>
            {
                options.Preload = true;
                options.IncludeSubDomains = true;
                options.MaxAge = TimeSpan.FromDays(60);
                //options.ExcludedHosts.Add("example.com");
                //options.ExcludedHosts.Add("www.example.com");
            });

            //services.AddCors();

            // configure strongly typed settings objects
            var appSettingsSection = Configuration.GetSection("AppSettings");
            services.Configure<AppSettings>(appSettingsSection);

            // configure jwt authentication
            var appSettings = appSettingsSection.Get<AppSettings>();
            var key = Encoding.ASCII.GetBytes(appSettings.Secret);
            services.AddAuthentication()
            .AddJwtBearer(x =>
            {
                x.Events = new JwtBearerEvents
                {
                    OnTokenValidated = context =>
                    {
                        var userService = context.HttpContext.RequestServices.GetRequiredService<IUserService>();
                        var userId = int.Parse(context.Principal.Identity.Name);
                        var user = userService.GetById(userId);
                        if (user == null)
                        {
                            // return unauthorized if user no longer exists
                            context.Fail("Unauthorized");
                        }
                        return Task.CompletedTask;
                    }
                };
                x.RequireHttpsMetadata = false;
                x.SaveToken = true;
                x.TokenValidationParameters = new TokenValidationParameters
                {
                    ValidateIssuerSigningKey = true,
                    IssuerSigningKey = new SymmetricSecurityKey(key),
                    ValidateIssuer = false,
                    ValidateAudience = false
                };
            });

            services.AddTransient<CustomEmailConfirmationTokenProvider<User>>();
            services.AddTransient<IEmailSender, EmailSender>();
            services.Configure<AuthMessageSenderOptions>(Configuration);

        }

        // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
        public void Configure(IApplicationBuilder app, IWebHostEnvironment env, ApplicationDbContext dataContext)
        {

            dataContext.Database.Migrate();

            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
                app.UseDatabaseErrorPage();
            }
            else
            {
                app.UseExceptionHandler("/Home/Error");
                // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
                app.UseHsts();
            }
            app.UseHttpsRedirection();
            app.UseStaticFiles();
            //app.UseSession();

            //app.UseCors(x => x
            //    .AllowAnyOrigin()
            //    .AllowAnyMethod()
            //    .AllowAnyHeader());

            

            app.UseRouting();

            app.UseAuthentication();
            app.UseAuthorization();

            
            
            app.UseEndpoints(endpoints =>
            {
                
                endpoints.MapControllerRoute(
                    name: "default",
                    pattern: "{controller=Home}/{action=Index}/{id?}");
                
                endpoints.MapRazorPages();
            });
        }
        
    }
}

Maybe you have some ideas kind weird to have access to the razor pages just stop like that.也许你有一些奇怪的想法来访问 razor 页面就这样停下来。 Any suggestions are much appreciated.非常感谢任何建议。

According to the docs you should map your Area folder as well.根据文档,您也应该 map Area 文件夹。

app.UseEndpoints(endpoints =>
{
    endpoints.MapControllerRoute(
        name: "MyArea",
        pattern: "{area:exists}/{controller=Home}/{action=Index}/{id?}");

    endpoints.MapControllerRoute(
        name: "default",
        pattern: "{controller=Home}/{action=Index}/{id?}");
});

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM