.net Core - 使用AWS负载平衡器和Elastic Beanstalk的HTTPS不起作用
我有一个网站在我的本地环境中正确运行HTTPS。当我将它上传到AWS时,它会永久超时或重定向。.net Core - 使用AWS负载平衡器和Elastic Beanstalk的HTTPS不起作用
我在AWS中的设置是一个Elastic Beanstalk应用程序,一个运行MS SQL的RDS数据库,我添加了一个负载均衡器来转发HTTPS请求,并且我有一个正确分配给负载均衡器的SSL证书。从所有我可以告诉我的应用程序正在运行,实际上,实体框架发射并正确构建我的数据库在我的RDS实例。我无法通过互联网访问该网站。
我试着设置听众不同的方式。如果我现在就写这样的,它只是重定向永远:
我有default HTTP/HTTPS port forwarding code in my Startup.cs:
public void ConfigureServices(IServiceCollection services)
{
// Sets all calls to require HTTPS: https://docs.microsoft.com/en-us/aspnet/core/security/enforcing-ssl
services.Configure<MvcOptions>(options =>
{
options.Filters.Add(new RequireHttpsAttribute());
});
...
}
public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
// Force all HTTP requests to redirect to HTTPS: https://docs.microsoft.com/en-us/aspnet/core/security/enforcing-ssl
var options = new RewriteOptions().AddRedirectToHttps();
app.UseRewriter(options);
...
app.UseForwardedHeaders(new ForwardedHeadersOptions
{
ForwardedHeaders = ForwardedHeaders.XForwardedFor |
ForwardedHeaders.XForwardedProto
});
...
}
我我已经花了好几天的时间在这方面,而且我无法完成它的工作。我试过把我的所有HTTPS代码都拿出来,但这不起作用。我已经尝试了来自this和this之类的博客的代码解决方案,但这也不起作用。从我读过的内容来看,Load Balancer最终处理HTTPS请求,然后将HTTP请求转发给我的应用程序。但我不知道如何正确处理该问题,仍然执行HTTPS,并将HTTP重定向到HTTPS。
这看起来好像它会是一些刚开箱即用的工具,而没有从我那里得到一堆设置。如果不是的话,我想现在有很多其他人会遇到这个问题,并且会在互联网上看到关于它的信息。我错过了一些小事?因为我完全以我的智慧为结局。
如果你能回答这个问题,你将成为我的新英雄。
所以我终于得到了这个修复。首先,负载均衡已经被设置为转发HTTPS 443 HTTP 80这样的:
届时,所有我在我的问题中列出的代码需要被删除(或无法在AWS环境中运行) 。我最初忘记删除services.Configure<MvcOptions>(options){}
代码行,我相信那是导致错误的原因。
然后我跟着this blog来处理X-Forwarded-Proto头。我把所有的代码在一个扩展文件:
public static class RedirectToProxiedHttpsExtensions
{
public static RewriteOptions AddRedirectToProxiedHttps(this RewriteOptions options)
{
options.Rules.Add(new RedirectToProxiedHttpsRule());
return options;
}
}
public class RedirectToProxiedHttpsRule : IRule
{
public virtual void ApplyRule(RewriteContext context)
{
var request = context.HttpContext.Request;
// #1) Did this request start off as HTTP?
string reqProtocol;
if (request.Headers.ContainsKey("X-Forwarded-Proto"))
{
reqProtocol = request.Headers["X-Forwarded-Proto"][0];
}
else
{
reqProtocol = (request.IsHttps ? "https" : "http");
}
// #2) If so, redirect to HTTPS equivalent
if (reqProtocol != "https")
{
var newUrl = new StringBuilder()
.Append("https://").Append(request.Host)
.Append(request.PathBase).Append(request.Path)
.Append(request.QueryString);
context.HttpContext.Response.Redirect(newUrl.ToString(), true);
}
}
}
最后,我把这个代码在Startup.cs:
public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
...
var options = new RewriteOptions()
.AddRedirectToProxiedHttps()
.AddRedirect("(.*)/$", "$1"); // remove trailing slash
app.UseRewriter(options);
...
}
所有它终于摸索之后!
谢谢。我终于得到了这个工作。我已将HealthCheck页面从默认/修改为html文件(即HealthCheck.html)。 –
根据this AWS docs你必须分析X-Forwarded-Proto
标题和响应与重定向仅当它是http
(不是https
)。
当前RedirectToHttpsRule
从Microsoft.AspNetCore.Rewrite
包确实not analyze this。您需要实施您自己的IRule
。
app。除非先清除已知的网络和代理,否则UseForwardedHeaders()似乎与AWS负载平衡器存在问题。
不要忘记首先安装Microsoft.AspNetCore.HttpOverrides NuGet软件包,否则它将无提示失败。
public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
...
app.UseForwardedHeaders(GetForwardedHeadersOptions());
...
}
private static ForwardedHeadersOptions GetForwardedHeadersOptions()
{
ForwardedHeadersOptions forwardedHeadersOptions = new ForwardedHeadersOptions()
{
ForwardedHeaders = ForwardedHeaders.XForwardedFor | ForwardedHeaders.XForwardedProto
};
forwardedHeadersOptions.KnownNetworks.Clear();
forwardedHeadersOptions.KnownProxies.Clear();
return forwardedHeadersOptions;
}
我试过了,它没有解决问题。我的解决方案确实解决了这个问题。 我正在使用旧版本的Microsoft.AspNetCore.HttpOverrides(1.1.2),可能会有问题吗? – Pinski
是的,这是从大多数中间件的X-Forwarded-For头处理正确的协议,但显然不适用于Rewrite.AddRedirectToHttps 我最终必须自己使用你的解决方案:)但我不得不改变它有点不重定向http://如果X-Forwarded-Proto标头丢失。这样我的Load Balancer运行状况检查没有被重定向到https。 – ArcadeRenegade
你能确认,如果你负载均衡是面向互联网吗?您可以在描述选项卡中看到此详细信息 – Shantanu
是的,负载平衡器是“面向互联网”。 – Pinski