Я работаю над тем, чтобы мое приложение.net core 1.1 работало за балансировщиком нагрузки и применяло https. У меня есть следующая настройка в моем Startup.cs
public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory, IServiceProvider serviceProvider, IOptions<Auth0Settings> auth0Settings)
{
loggerFactory.AddConsole(Configuration.GetSection("Logging"));
loggerFactory.AddDebug();
var startupLogger = loggerFactory.CreateLogger<Startup>();
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<HttpsRedirectMiddleware>();
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 предназначен для проверки того, что LB имеет набор X-Forwarded-Proto, он делает это и возвращается как https как единственное значение. Когда я перехожу на сайт (https://myapp.somedomain.net), он знает, что я не аутентифицирован и перенаправляет меня на (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();
});
Вышеизложенное работает отлично, но является взломом. Я хотел бы сделать это правильно.