将HTTP重定向到负载均衡器后面的HTTPS

时间:2019-02-13 16:10:00

标签: redirect asp.net-core https .net-core

我正在将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而是改用RequireHttpsAttributeAddRedirectToHttps重写中间件,则重定向可以正常工作。我只是无法使用UseHttpsRedirection中间件。

1 个答案:

答案 0 :(得分:0)

好的,我总结一下评论:

  

我的负载均衡器未执行HTTPS重定向,因此这就是为什么我认为我需要中间件的原因。除非我误会了?

那么您将HTTP请求发送到代理,该请求将重定向到您的应用程序,然后出现该错误?

这是因为X-Forwarded-Proto标头具有值http,并且Https重定向中间件不会将其识别为安全协议并尝试重定向。

根据documentationUseHttpsRedirection需要https配置:

  

中间件必须具有端口,才能将不安全的请求重定向到HTTPS。如果没有可用端口:

     
      
  • 没有重定向到HTTPS。
  •   
  • 中间件记录警告“无法确定要重定向的https端口。”
  •   
然后,由于X-Forwarded-Proto标头设置为https,并且重定向中间件应跳过该请求,因此对代理服务器的HTTPS请求(向代理服务器的请求)应该可以工作。

在这种情况下,您还必须在应用程序上配置https(因为中间件需要使用https)。它可以是自签名证书,在反向代理配置中,永远不要点击ASP.NET Core应用程序上的443。您甚至不必公开端口(使用Docker时)。

或者,在反向代理本身上处理https重定向。这是更好的方法,因为除非使用https,否则请求不会首先打到您的应用程序上。