.net Core - 使用AWS负载平衡器和Elastic Beanstalk的HTTPS不起作用

问题描述:

我有一个网站在我的本地环境中正确运行HTTPS。当我将它上传到AWS时,它会永久超时或重定向。.net Core - 使用AWS负载平衡器和Elastic Beanstalk的HTTPS不起作用

我在AWS中的设置是一个Elastic Beanstalk应用程序,一个运行MS SQL的RDS数据库,我添加了一个负载均衡器来转发HTTPS请求,并且我有一个正确分配给负载均衡器的SSL证书。从所有我可以告诉我的应用程序正在运行,实际上,实体框架发射并正确构建我的数据库在我的RDS实例。我无法通过互联网访问该网站。

我试着设置听众不同的方式。如果我现在就写这样的,它只是重定向永远: Redirect Forever

如果我现在就写这样的,它只是超时: enter image description here

我有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代码都拿出来,但这不起作用。我已经尝试了来自thisthis之类的博客的代码解决方案,但这也不起作用。从我读过的内容来看,Load Balancer最终处理HTTPS请求,然后将HTTP请求转发给我的应用程序。但我不知道如何正确处理该问题,仍然执行HTTPS,并将HTTP重定向到HTTPS。

这看起来好像它会是一些刚开箱即用的工具,而没有从我那里得到一堆设置。如果不是的话,我想现在有很多其他人会遇到这个问题,并且会在互联网上看到关于它的信息。我错过了一些小事?因为我完全以我的智慧为结局。

如果你能回答这个问题,你将成为我的新英雄。

+0

你能确认,如果你负载均衡是面向互联网吗?您可以在描述选项卡中看到此详细信息 – Shantanu

+0

是的,负载平衡器是“面向互联网”。 – Pinski

所以我终于得到了这个修复。首先,负载均衡已经被设置为转发HTTPS 443 HTTP 80这样的: enter image description here

届时,所有我在我的问题中列出的代码需要被删除(或无法在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); 
    ... 
} 

所有它终于摸索之后!

+0

谢谢。我终于得到了这个工作。我已将HealthCheck页面从默认/修改为html文件(即HealthCheck.html)。 –

根据this AWS docs你必须分析X-Forwarded-Proto标题和响应与重定向仅当它是http(不是https)。

当前RedirectToHttpsRuleMicrosoft.AspNetCore.Rewrite包确实not analyze this。您需要实施您自己的IRule

+0

因此,我试着分析[此博客](http://blog.treeloop.com/asp-net-core-url-rewrite-module-behind-load-balancer/)中的X-Forwarded-Proto标题作为指南。我仍然无法实现它的工作。 – Pinski

+0

让我们继续努力,遵循博客示例。感谢您的意见和帮助。 – Pinski

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; 
    } 
+0

我试过了,它没有解决问题。我的解决方案确实解决了这个问题。 我正在使用旧版本的Microsoft.AspNetCore.HttpOverrides(1.1.2),可能会有问题吗? – Pinski

+0

是的,这是从大多数中间件的X-Forwarded-For头处理正确的协议,但显然不适用于Rewrite.AddRedirectToHttps 我最终必须自己使用你的解决方案:)但我不得不改变它有点不重定向http://如果X-Forwarded-Proto标头丢失。这样我的Load Balancer运行状况检查没有被重定向到https。 – ArcadeRenegade