4

我有一個網站在我的本地環境中正確運行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

回答

6

所以我終於得到了這個修復。首先,負載均衡已經被設置爲轉發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)。 –

3

根據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

0

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

相關問題