Asp.net core Htttp 400错误请求标头太长

Asp.net core Htttp 400错误请求标头太长,asp.net-core,identityserver4,openid-connect,iis-10,Asp.net Core,Identityserver4,Openid Connect,Iis 10,我目前正在使用Asp.net core 5.0和Identity server 4开发一个应用程序。我的OIDC身份验证流由Microsoft.AspNetCore.authentication.OpenIdConnect处理。我将我的应用程序部署到IIS中,并获得登录屏幕。但是在登录之后,我得到了Http 400错误请求错误。。我检查了我的应用程序cookie,它包含许多AspNetCore.OpenIdConnect.Noncecookies。我删除了cookies,但没有解决我的问题。处理

我目前正在使用Asp.net core 5.0和Identity server 4开发一个应用程序。我的OIDC身份验证流由
Microsoft.AspNetCore.authentication.OpenIdConnect
处理。我将我的应用程序部署到IIS中,并获得登录屏幕。但是在登录之后,我得到了Http 400错误请求错误。。我检查了我的应用程序cookie,它包含许多
AspNetCore.OpenIdConnect.Nonce
cookies。我删除了cookies,但没有解决我的问题。处理此解决方案的正确解决方案是什么。我试过了,但没用。我将分享下面的代码

MVC启动.cs

public class Startup
    {
        public Startup(IConfiguration configuration)
        {
            Configuration = configuration;
        }
        public IConfiguration Configuration { get; }

        public void ConfigureServices(IServiceCollection services)
        {
            services.AddMvc(options =>
            {
                var policy = new AuthorizationPolicyBuilder()
                    .RequireAuthenticatedUser()
                    .Build();
                options.Filters.Add(new AuthorizeFilter(policy));
            }).SetCompatibilityVersion(CompatibilityVersion.Version_3_0);
            services.AddScoped<RenewToken>();
            services.AddAuthorization(options =>
            {
                options.AddPolicy("CreatePolicy", policy => policy.RequireAssertion(context => AuthorizeAccess(context, "RC", "UC")));
                options.AddPolicy("ReadPolicy", policy => policy.RequireAssertion(context => AuthorizeAccess(context, "RR", "UR")));
            });
            services.AddControllersWithViews();
            JwtSecurityTokenHandler.DefaultInboundClaimTypeMap.Clear();

            services.AddAuthentication(options =>
            {
                options.DefaultScheme = "Cookies";
                options.DefaultChallengeScheme = "oidc";
            }).AddCookie("Cookies", options =>
            {
                options.Cookie.Name = "Cookies";
                options.ExpireTimeSpan = TimeSpan.FromMinutes(10);
                options.SlidingExpiration = true;
            }).AddOpenIdConnect("oidc", options =>
                {
                    options.BackchannelHttpHandler = new HttpClientHandler { ServerCertificateCustomValidationCallback = delegate { return true; } };
                    options.Authority = Configuration.GetSection("API:IDS4").Value;
                    options.SignInScheme = "Cookies";
                    options.SignedOutRedirectUri = Configuration.GetSection("API:WebClient").Value + "/signout-callback-oidc";
                    options.RequireHttpsMetadata = true;
                    options.ClientId = "mvc";
                    options.ClientSecret = "*****";
                    options.ResponseType = "code";
                    options.UsePkce = true;
                    options.Scope.Add("profile");
                    options.Scope.Add("mcApi");
                    options.Scope.Add("Api1");
                    options.Scope.Add("Api2");
                    options.Scope.Add("Api3");
                    options.Scope.Add("Api4");
                    options.Scope.Add("Api5");
                    options.Scope.Add("Api6");
                    options.Scope.Add("Api7");
                    options.Scope.Add("offline_access");
                    options.GetClaimsFromUserInfoEndpoint = true;
                    options.SaveTokens = true;
                    options.Events.OnRedirectToIdentityProvider = context =>
                    {
                        context.ProtocolMessage.Prompt = "login";
                        return Task.CompletedTask;
                    };

                    options.Events = new OpenIdConnectEvents
                    {
                        OnRemoteFailure = (context) =>
                        {
                            context.Response.Redirect("/");
                            context.HandleResponse();

                            return Task.CompletedTask;
                        }
                    };
                    options.TokenValidationParameters = new TokenValidationParameters
                    {
                        RoleClaimType = JwtClaimTypes.Role
                    };

                });

            
            services.AddHttpClient<IAdminService, AdminService>();
            services.AddSingleton<DataProtectionPurposeStrings>();
            services.AddSingleton<GlobalConstants>();
        }

        private bool AuthorizeAccess(AuthorizationHandlerContext context, string roleClaim, string userClaim)
        {
            return context.User.HasClaim(claim => claim.Type == roleClaim && claim.Value == "True") &&
                   context.User.HasClaim(claim => claim.Type == userClaim && claim.Value == "True") ||
                   context.User.IsInRole("MyAdmin");
        }

        // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
        public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
        {
            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
            }
            else
            {
                app.UseExceptionHandler("/Home/Error");                
                app.UseHsts();
            }
            app.UseHttpsRedirection();
            app.UseStaticFiles();
            app.UseCookiePolicy();
            app.UseRouting();

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

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

        }
    }
public class Startup
    {
        public IWebHostEnvironment Environment { get; }
        public IConfiguration Configuration { get; }
        public Startup(IWebHostEnvironment environment, IConfiguration configuration)
        {
            Environment = environment;
            Configuration = configuration;
        }
        // This method gets called by the runtime. Use this method to add services to the container.
        // For more information on how to configure your application, visit https://go.microsoft.com/fwlink/?LinkID=398940
        public void ConfigureServices(IServiceCollection services)
        {
            services.AddControllersWithViews();

            /****Register asp.net core Identity DBConetexts***/
            var idenConnectionString = Configuration["DbContextSettings:IdentityConnectionString"];
            
            var dbPassword = Configuration["DbContextSettings:DbPassword"];
            var builder = new NpgsqlConnectionStringBuilder(idenConnectionString)
            {
                Password = dbPassword
            };
            

            services.AddDbContext<IdentityDBContext>(opts => opts.UseNpgsql(builder.ConnectionString));

            services.AddIdentity<ApplicationUser, ApplicationRole>(options =>
            {
                options.Password.RequiredLength = 8;
                options.User.AllowedUserNameCharacters = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-._@+ ";
                options.SignIn.RequireConfirmedEmail = false;
                options.User.RequireUniqueEmail = false;
            }).AddRoles<ApplicationRole>().AddEntityFrameworkStores<IdentityDBContext>()
            .AddDefaultTokenProviders();

            /****Identity Server implementation with asp.net core Identity***/

            var idsServerConnectionString = Configuration["DbContextSettings:IdentityServer4ConnectionString"];
            var migrationAssembly = typeof(Startup).GetTypeInfo().Assembly.GetName().Name;
            var idsServerdbPassword = Configuration["DbContextSettings:DbPassword"];
            var idsServerbuilder = new NpgsqlConnectionStringBuilder(idsServerConnectionString)
            {
                Password = dbPassword
            };
            
            var idBuilder = services.AddIdentityServer(options =>
              {
                  options.Events.RaiseErrorEvents = true;
                  options.Events.RaiseInformationEvents = true;
                  options.Events.RaiseFailureEvents = true;
                  options.Events.RaiseSuccessEvents = true;
                  options.UserInteraction.LoginUrl = "/Account/Login";
                  options.UserInteraction.LogoutUrl = "/Account/Login";
                  options.Authentication = new AuthenticationOptions()
                  {
                      CookieLifetime = TimeSpan.FromMinutes(10),
                      CookieSlidingExpiration = true
                  };
              })
            .AddConfigurationStore(options =>
            {
                options.ConfigureDbContext = b => b.UseNpgsql(idsServerbuilder.ConnectionString, sql => sql.MigrationsAssembly(migrationAssembly));
            })
            .AddOperationalStore(options =>
            {
                options.ConfigureDbContext = b => b.UseNpgsql(idsServerbuilder.ConnectionString, sql => sql.MigrationsAssembly(migrationAssembly));
                options.EnableTokenCleanup = true;
            }).AddAspNetIdentity<MembershipUser>()
            .AddProfileService<ProfileService>();

            X509Certificate2 cert = null;
            using (var certStore = new X509Store(StoreName.My, StoreLocation.LocalMachine))
            {
                certStore.Open(OpenFlags.ReadOnly);
                var certCollection = certStore.Certificates.Find(
                    X509FindType.FindByThumbprint,
                    "thumbprint",
                    false);

                if (certCollection.Count > 0)
                {
                    cert = certCollection[0];
                }
            }
            if (Environment.IsDevelopment())
            {
                idBuilder.AddDeveloperSigningCredential();
            }
            else
            {
                idBuilder.AddSigningCredential(cert);
            }

            idBuilder.Services.ConfigureExternalCookie(options =>
            {
                options.Cookie.IsEssential = true;
                options.Cookie.SameSite = (SameSiteMode)(-1); 
            });

            idBuilder.Services.ConfigureApplicationCookie(options =>
            {
                options.Cookie.IsEssential = true;
                options.Cookie.SameSite = (SameSiteMode)(-1);
            });

            services.AddMediatR(typeof(Startup));

            RegisterServices(services);
        }

        private void RegisterServices(IServiceCollection services)
        {
            services.AddSingleton<IEventBus, RabbitMQBus>(sp =>
            {
                var scopeFactory = sp.GetRequiredService<IServiceScopeFactory>();
                return new RabbitMQBus(sp.GetService<IMediator>(), scopeFactory);
            });

            services.AddTransient<UserDBContext>();
        }
        
        // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
        public void Configure(IApplicationBuilder app, IWebHostEnvironment env, ILoggerFactory loggerFactory)
        {
            if (Environment.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
            }

            // uncomment if you want to add MVC
            app.UseStaticFiles();
            app.UseRouting();

            app.UseIdentityServer();
            app.UseAuthorization();
            app.UseEndpoints(endpoints =>
            {
                endpoints.MapDefaultControllerRoute();
            });
        }
    }
公共类启动
{
公共启动(IConfiguration配置)
{
配置=配置;
}
公共IConfiguration配置{get;}
public void配置服务(IServiceCollection服务)
{
services.AddMvc(选项=>
{
var policy=new AuthorizationPolicyBuilder()
.RequireAuthenticatedUser()文件
.Build();
options.Filters.Add(新的授权过滤器(策略));
}).SetCompatibilityVersion(CompatibilityVersion.Version_3_0);
services.addScope();
services.AddAuthorization(选项=>
{
options.AddPolicy(“CreatePolicy”,policy=>policy.RequireAssertion(context=>AuthorizeAccess(context,“RC”,“UC”));
options.AddPolicy(“ReadPolicy”,policy=>policy.RequireAssertion(context=>AuthorizeAccess(context,“RR”,“UR”));
});
services.AddControllersWithViews();
JwtSecurityTokenHandler.DefaultInboundClaimTypeMap.Clear();
services.AddAuthentication(选项=>
{
options.DefaultScheme=“Cookies”;
options.DefaultChallengeScheme=“oidc”;
}).AddCookie(“Cookies”,选项=>
{
options.Cookie.Name=“Cookies”;
options.ExpireTimeSpan=TimeSpan.FromMinutes(10);
options.SlidingExpiration=true;
}).AddOpenIdConnect(“oidc”,选项=>
{
options.BackchannelHttpHandler=new HttpClientHandler{ServerCertificateCustomValidationCallback=delegate{return true;}};
options.Authority=Configuration.GetSection(“API:IDS4”).Value;
options.signnscheme=“Cookies”;
options.SignedOutRedirectUri=Configuration.GetSection(“API:WebClient”).Value+“/signout回调oidc”;
options.RequireHttpsMetadata=true;
options.ClientId=“mvc”;
options.ClientSecret=“*******”;
options.ResponseType=“code”;
options.UsePkce=true;
选项。范围。添加(“配置文件”);
选项。范围。添加(“mcApi”);
选项。范围。添加(“Api1”);
选项。范围。添加(“Api2”);
选项。范围。添加(“Api3”);
选项。范围。添加(“Api4”);
选项。范围。添加(“Api5”);
选项。范围。添加(“Api6”);
选项。范围。添加(“Api7”);
options.Scope.Add(“脱机访问”);
options.GetClaimsFromUserInfoEndpoint=true;
options.SaveTokens=true;
options.Events.OnRedirectToIdentityProvider=上下文=>
{
context.ProtocolMessage.Prompt=“登录”;
返回Task.CompletedTask;
};
options.Events=新的OpenIdConnectEvents
{
OnRemoteFailure=(上下文)=>
{
context.Response.Redirect(“/”);
context.HandleResponse();
返回Task.CompletedTask;
}
};
options.TokenValidationParameters=新的TokenValidationParameters
{
RoleClaimType=JwtClaimTypes.Role
};
});
services.AddHttpClient();
services.AddSingleton();
services.AddSingleton();
}
私有bool AuthorizeAccess(AuthorizationHandlerContext上下文、字符串roleClaim、字符串userClaim)
{
返回context.User.HasClaim(claim=>claim.Type==roleClaim&&claim.Value==True)&&
context.User.HasClaim(claim=>claim.Type==userClaim&&claim.Value==“True”)||
context.User.IsInRole(“MyAdmin”);
}
//此方法由运行时调用。请使用此方法配置HTTP请求管道。
public void配置(IApplicationBuilder应用程序、IWebHostEnvironment环境)
{
if(env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
其他的
{
app.UseExceptionHandler(“/Home/Error”);
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseCookiePolicy();
app.UseRouting();
app.UseAuthentication();
app.UseAuthorization();
app.UseEndpoints(端点=>
{
endpoints.MapControllerRoute(
名称:“默认”,
模式:“{controller=Home}/{action=Index}/{id?}”);
});
}
}
身份服务器启动.cs

public class Startup
    {
        public Startup(IConfiguration configuration)
        {
            Configuration = configuration;
        }
        public IConfiguration Configuration { get; }

        public void ConfigureServices(IServiceCollection services)
        {
            services.AddMvc(options =>
            {
                var policy = new AuthorizationPolicyBuilder()
                    .RequireAuthenticatedUser()
                    .Build();
                options.Filters.Add(new AuthorizeFilter(policy));
            }).SetCompatibilityVersion(CompatibilityVersion.Version_3_0);
            services.AddScoped<RenewToken>();
            services.AddAuthorization(options =>
            {
                options.AddPolicy("CreatePolicy", policy => policy.RequireAssertion(context => AuthorizeAccess(context, "RC", "UC")));
                options.AddPolicy("ReadPolicy", policy => policy.RequireAssertion(context => AuthorizeAccess(context, "RR", "UR")));
            });
            services.AddControllersWithViews();
            JwtSecurityTokenHandler.DefaultInboundClaimTypeMap.Clear();

            services.AddAuthentication(options =>
            {
                options.DefaultScheme = "Cookies";
                options.DefaultChallengeScheme = "oidc";
            }).AddCookie("Cookies", options =>
            {
                options.Cookie.Name = "Cookies";
                options.ExpireTimeSpan = TimeSpan.FromMinutes(10);
                options.SlidingExpiration = true;
            }).AddOpenIdConnect("oidc", options =>
                {
                    options.BackchannelHttpHandler = new HttpClientHandler { ServerCertificateCustomValidationCallback = delegate { return true; } };
                    options.Authority = Configuration.GetSection("API:IDS4").Value;
                    options.SignInScheme = "Cookies";
                    options.SignedOutRedirectUri = Configuration.GetSection("API:WebClient").Value + "/signout-callback-oidc";
                    options.RequireHttpsMetadata = true;
                    options.ClientId = "mvc";
                    options.ClientSecret = "*****";
                    options.ResponseType = "code";
                    options.UsePkce = true;
                    options.Scope.Add("profile");
                    options.Scope.Add("mcApi");
                    options.Scope.Add("Api1");
                    options.Scope.Add("Api2");
                    options.Scope.Add("Api3");
                    options.Scope.Add("Api4");
                    options.Scope.Add("Api5");
                    options.Scope.Add("Api6");
                    options.Scope.Add("Api7");
                    options.Scope.Add("offline_access");
                    options.GetClaimsFromUserInfoEndpoint = true;
                    options.SaveTokens = true;
                    options.Events.OnRedirectToIdentityProvider = context =>
                    {
                        context.ProtocolMessage.Prompt = "login";
                        return Task.CompletedTask;
                    };

                    options.Events = new OpenIdConnectEvents
                    {
                        OnRemoteFailure = (context) =>
                        {
                            context.Response.Redirect("/");
                            context.HandleResponse();

                            return Task.CompletedTask;
                        }
                    };
                    options.TokenValidationParameters = new TokenValidationParameters
                    {
                        RoleClaimType = JwtClaimTypes.Role
                    };

                });

            
            services.AddHttpClient<IAdminService, AdminService>();
            services.AddSingleton<DataProtectionPurposeStrings>();
            services.AddSingleton<GlobalConstants>();
        }

        private bool AuthorizeAccess(AuthorizationHandlerContext context, string roleClaim, string userClaim)
        {
            return context.User.HasClaim(claim => claim.Type == roleClaim && claim.Value == "True") &&
                   context.User.HasClaim(claim => claim.Type == userClaim && claim.Value == "True") ||
                   context.User.IsInRole("MyAdmin");
        }

        // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
        public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
        {
            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
            }
            else
            {
                app.UseExceptionHandler("/Home/Error");                
                app.UseHsts();
            }
            app.UseHttpsRedirection();
            app.UseStaticFiles();
            app.UseCookiePolicy();
            app.UseRouting();

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

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

        }
    }
public class Startup
    {
        public IWebHostEnvironment Environment { get; }
        public IConfiguration Configuration { get; }
        public Startup(IWebHostEnvironment environment, IConfiguration configuration)
        {
            Environment = environment;
            Configuration = configuration;
        }
        // This method gets called by the runtime. Use this method to add services to the container.
        // For more information on how to configure your application, visit https://go.microsoft.com/fwlink/?LinkID=398940
        public void ConfigureServices(IServiceCollection services)
        {
            services.AddControllersWithViews();

            /****Register asp.net core Identity DBConetexts***/
            var idenConnectionString = Configuration["DbContextSettings:IdentityConnectionString"];
            
            var dbPassword = Configuration["DbContextSettings:DbPassword"];
            var builder = new NpgsqlConnectionStringBuilder(idenConnectionString)
            {
                Password = dbPassword
            };
            

            services.AddDbContext<IdentityDBContext>(opts => opts.UseNpgsql(builder.ConnectionString));

            services.AddIdentity<ApplicationUser, ApplicationRole>(options =>
            {
                options.Password.RequiredLength = 8;
                options.User.AllowedUserNameCharacters = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-._@+ ";
                options.SignIn.RequireConfirmedEmail = false;
                options.User.RequireUniqueEmail = false;
            }).AddRoles<ApplicationRole>().AddEntityFrameworkStores<IdentityDBContext>()
            .AddDefaultTokenProviders();

            /****Identity Server implementation with asp.net core Identity***/

            var idsServerConnectionString = Configuration["DbContextSettings:IdentityServer4ConnectionString"];
            var migrationAssembly = typeof(Startup).GetTypeInfo().Assembly.GetName().Name;
            var idsServerdbPassword = Configuration["DbContextSettings:DbPassword"];
            var idsServerbuilder = new NpgsqlConnectionStringBuilder(idsServerConnectionString)
            {
                Password = dbPassword
            };
            
            var idBuilder = services.AddIdentityServer(options =>
              {
                  options.Events.RaiseErrorEvents = true;
                  options.Events.RaiseInformationEvents = true;
                  options.Events.RaiseFailureEvents = true;
                  options.Events.RaiseSuccessEvents = true;
                  options.UserInteraction.LoginUrl = "/Account/Login";
                  options.UserInteraction.LogoutUrl = "/Account/Login";
                  options.Authentication = new AuthenticationOptions()
                  {
                      CookieLifetime = TimeSpan.FromMinutes(10),
                      CookieSlidingExpiration = true
                  };
              })
            .AddConfigurationStore(options =>
            {
                options.ConfigureDbContext = b => b.UseNpgsql(idsServerbuilder.ConnectionString, sql => sql.MigrationsAssembly(migrationAssembly));
            })
            .AddOperationalStore(options =>
            {
                options.ConfigureDbContext = b => b.UseNpgsql(idsServerbuilder.ConnectionString, sql => sql.MigrationsAssembly(migrationAssembly));
                options.EnableTokenCleanup = true;
            }).AddAspNetIdentity<MembershipUser>()
            .AddProfileService<ProfileService>();

            X509Certificate2 cert = null;
            using (var certStore = new X509Store(StoreName.My, StoreLocation.LocalMachine))
            {
                certStore.Open(OpenFlags.ReadOnly);
                var certCollection = certStore.Certificates.Find(
                    X509FindType.FindByThumbprint,
                    "thumbprint",
                    false);

                if (certCollection.Count > 0)
                {
                    cert = certCollection[0];
                }
            }
            if (Environment.IsDevelopment())
            {
                idBuilder.AddDeveloperSigningCredential();
            }
            else
            {
                idBuilder.AddSigningCredential(cert);
            }

            idBuilder.Services.ConfigureExternalCookie(options =>
            {
                options.Cookie.IsEssential = true;
                options.Cookie.SameSite = (SameSiteMode)(-1); 
            });

            idBuilder.Services.ConfigureApplicationCookie(options =>
            {
                options.Cookie.IsEssential = true;
                options.Cookie.SameSite = (SameSiteMode)(-1);
            });

            services.AddMediatR(typeof(Startup));

            RegisterServices(services);
        }

        private void RegisterServices(IServiceCollection services)
        {
            services.AddSingleton<IEventBus, RabbitMQBus>(sp =>
            {
                var scopeFactory = sp.GetRequiredService<IServiceScopeFactory>();
                return new RabbitMQBus(sp.GetService<IMediator>(), scopeFactory);
            });

            services.AddTransient<UserDBContext>();
        }
        
        // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
        public void Configure(IApplicationBuilder app, IWebHostEnvironment env, ILoggerFactory loggerFactory)
        {
            if (Environment.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
            }

            // uncomment if you want to add MVC
            app.UseStaticFiles();
            app.UseRouting();

            app.UseIdentityServer();
            app.UseAuthorization();
            app.UseEndpoints(endpoints =>
            {
                endpoints.MapDefaultControllerRoute();
            });
        }
    }
公共类启动
{
公共IWebHostEnvironment环境{get;}
公共IConfiguration配置{get;}
公共街