我正在将ASP.NET Core应用程序移至AWS Beanstalk,并且在强制所有请求使用HTTPS时遇到问题。日志中有用的错误是:
无法确定要重定向的https端口。
根据执行HTTPS的docs:
如果在反向代理配置中转发请求,请在调用HTTPS重定向中间件之前使用转发头中间件。转发的标头中间件使用X-Forwarded-Proto标头来更新Request.Scheme
根据我的设置,看起来应该是正确的:
public void Configure(IApplicationBuilder app, IHostingEnvironment env) {
// aws ssl termination
app.UseForwardedHeaders(new ForwardedHeadersOptions() {
ForwardedHeaders = ForwardedHeaders.XForwardedProto
});
if (env.IsDevelopment()) {
app.UseDeveloperExceptionPage();
} else {
app.UseExceptionHandler("/error/500");
app.UseHsts();
}
app.UseHttpsRedirection();
// lots of other stuff removed for brevity
}
负载平衡器正在接受HTTP(80)和HTTPS(443)上的请求,并且该应用程序已在IIS中设置为仅接受HTTP(80)上的请求。这和错误消息使它看起来与他们制作的announcement有关,但是基于文档,我希望前向标头中间件能够解决该问题。
更新
如果我不使用UseHttpsRedirection
而是改用RequireHttpsAttribute
和AddRedirectToHttps
重写中间件,则重定向可以正常工作。我只是无法使用UseHttpsRedirection
中间件。
答案 0 :(得分:0)
好的,我总结一下评论:
我的负载均衡器未执行HTTPS重定向,因此这就是为什么我认为我需要中间件的原因。除非我误会了?
那么您将HTTP请求发送到代理,该请求将重定向到您的应用程序,然后出现该错误?
这是因为X-Forwarded-Proto
标头具有值http
,并且Https重定向中间件不会将其识别为安全协议并尝试重定向。
根据documentation,UseHttpsRedirection
需要https配置:
然后,由于中间件必须具有端口,才能将不安全的请求重定向到HTTPS。如果没有可用端口:
- 没有重定向到HTTPS。
- 中间件记录警告“无法确定要重定向的https端口。”
X-Forwarded-Proto
标头设置为https
,并且重定向中间件应跳过该请求,因此对代理服务器的HTTPS请求(向代理服务器的请求)应该可以工作。
在这种情况下,您还必须在应用程序上配置https(因为中间件需要使用https)。它可以是自签名证书,在反向代理配置中,永远不要点击ASP.NET Core应用程序上的443。您甚至不必公开端口(使用Docker时)。
或者,在反向代理本身上处理https重定向。这是更好的方法,因为除非使用https,否则请求不会首先打到您的应用程序上。