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

Redirect 在负载均衡器后面将HTTP重定向到HTTPS,redirect,asp.net-core,https,.net-core,Redirect,Asp.net Core,Https,.net Core,我正在将一个ASP.NET核心应用程序移动到AWS Beanstalk,在强制所有请求使用HTTPS时遇到了一个问题。日志中的有用错误是: 无法确定重定向的https端口 根据关于实施HTTPS的声明: 如果请求在反向代理配置中转发,请在调用HTTPS重定向中间件之前使用转发头中间件。转发标头中间件使用X-Forwarded-Proto标头更新Request.Scheme 根据我的设置,它看起来应该是正确的: public void Configure(IApplicationBuilder a

我正在将一个ASP.NET核心应用程序移动到AWS Beanstalk,在强制所有请求使用HTTPS时遇到了一个问题。日志中的有用错误是:

无法确定重定向的https端口

根据关于实施HTTPS的声明:

如果请求在反向代理配置中转发,请在调用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)上的请求。这和错误消息使它看起来与他们制作的文档相关,但是基于文档,我希望ForwardHeaders中间件能够解决这个问题

更新


如果不使用
UseHttpsRedirection
I切换到使用
RequireHttpAttribute
AddRedirectToHttps
重写中间件,重定向将正常工作。我无法使用的只是
UseHttpsRedirection
中间件。

好的,我总结一下评论:

我的负载平衡器没有执行HTTPS重定向,因此我认为我需要中间件。除非我是误会

因此,您向代理发送一个HTTP请求,代理被重定向到您的应用程序,然后您得到了那个错误

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

根据,需要对
UseHttpsRedirection
进行https配置:

中间件必须有一个端口可用于将不安全的请求重定向到HTTPS。如果没有可用的端口:

  • 无法重定向到HTTPS
  • 中间件记录警告“无法确定重定向的https端口”
由于
X-Forwarded-Proto
头被设置为
HTTPS
,重定向中间件应该跳过它,因此代理上的HTTPS请求(到代理)应该可以工作

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


或者,在反向代理本身上处理https重定向。这是一种更好的方法,因为请求从一开始就不会命中您的应用程序,除非它的https。

AWS是否使用不同的转发头名称?如果是这样,您必须在具有选项delegateNope的
UseForwardHeaders()
重载中配置转发头键名称,但它们没有。如果我切换到使用
requireHttpAttribute
AddRedirectToHttps
重写中间件,重定向将正常工作。只是
UseHttpsRedirection
似乎无法正常工作。根据示例,当没有配置端口时会出现错误。但是,由于反向代理是终止端点,因此可以安全地删除
app.usehttpseredirection()。当标头和转发标头中间件存在时,中间件(如授权)仍会将其识别为安全连接。或者配置端口并且不公开它(如果您使用docker),那么您也可以测试ssllocally@Tseng在这些文档中,他们声明:
反向代理配置中部署的应用允许代理处理连接安全性(HTTPS)。如果代理还处理HTTPS重定向,则无需使用HTTPS重定向中间件。
我的负载平衡器没有执行HTTPS重定向,因此我认为我需要中间件。除非我误解了?好吧,我总结一下:你向代理发送一个HTTP请求,它被重定向到你的应用程序,然后你得到了那个错误?对吗?代理上的HTTPs请求(到代理)应该可以工作,是吗?在这种情况下,您还必须在应用程序上配置https(中间件需要配置https,但只有当请求不是来自https且没有转发的头时,才会调用https)。它可以是自签名证书,在反向代理配置中,ASP.NET核心应用程序上的443不应被命中。或者在反向代理上执行http->https重定向