.net Core X Forwarded Proto无法正常工作

我正在努力让我的.net核心1.1应用程序在负载均衡器后面工作并强制执行https。 我的Startup.cs中有以下设置

public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory, IServiceProvider serviceProvider, IOptions auth0Settings) { loggerFactory.AddConsole(Configuration.GetSection("Logging")); loggerFactory.AddDebug(); var startupLogger = loggerFactory.CreateLogger(); if (env.IsDevelopment()) { app.UseDeveloperExceptionPage(); app.UseDatabaseErrorPage(); app.UseBrowserLink(); startupLogger.LogInformation("In Development"); } else { startupLogger.LogInformation("NOT in development"); app.UseExceptionHandler("/Home/Error"); } app.UseMiddleware(); app.UseForwardedHeaders(new ForwardedHeadersOptions { ForwardedHeaders = ForwardedHeaders.XForwardedFor | ForwardedHeaders.XForwardedProto });` app.UseCookieAuthentication(new CookieAuthenticationOptions { AuthenticationScheme= CookieAuthenticationDefaults.AuthenticationScheme, AutomaticAuthenticate = true, AutomaticChallenge = true, CookieHttpOnly = true, SlidingExpiration = true }); 

HttpsRedirectMiddleware用于validationLB具有X-Forwarded-Proto设置,确实如此,并以https作为唯一值返回。 当我访问该网站( https://myapp.somedomain.net )时,它知道我未经过身份validation并将我重定向到( http://myapp.somedomain.net/Account/Logon?ReturnUrl=%2f )。 它失去了SSL连接并切换回我的端口80。 .net核心文档说使用如下所示的“UseForwardedHeaders”,这在我的情况下不起作用。 当此切换发生时,控制台记录器没有来自中间件的任何错误或警告。

对于短期修复,我把它放在“UseForwardedHeaders”下面

  app.Use(async (context, next) => { var xproto = context.Request.Headers["X-Forwarded-Proto"].ToString(); if (xproto!=null && xproto.StartsWith("https", StringComparison.OrdinalIgnoreCase)){ startupLogger.LogInformation("Switched to https"); context.Request.Scheme = "https"; } await next(); }); 

以上工作完美,但是是一个黑客。 我想以正确的方式做到这一点。

.net Core有转发标头的默认设置。 对于IIS集成,它默认为127.0.0.1。 在跟踪源代码后,您可以清除已知网络和已知代理以接受任何转发的请求。 最好还是设置防火墙或将已知网络锁定到私有子网。

 var forwardingOptions = new ForwardedHeadersOptions() { ForwardedHeaders = ForwardedHeaders.XForwardedFor | ForwardedHeaders.XForwardedProto }; forwardingOptions.KnownNetworks.Clear(); //its loopback by default forwardingOptions.KnownProxies.Clear(); app.UseForwardedHeaders(forwardingOptions);