4

ローカル環境でHTTPSを正しく実行するWebサイトがあります。 AWSにアップロードすると、タイムアウトしたり、永遠にリダイレクトされたりします。.netコア - AWS Load BalancerとElastic Beanstalkを使用したHTTPSが機能しない

MS SQLを実行するRDSデータベースであるElastic Beanstalkアプリケーションは、ロードバランサを追加してHTTPS要求を転送し、ロードバランサにSSL証明書が正しく割り当てられています。 Entity Frameworkが起動し、RDSインスタンスにデータベースが正しく構築されていることがわかりました。私はちょうどインターネットを通じてウェブサイトにアクセスすることはできません。

私は、リスナーをさまざまな方法で設定しようとしました。私はこのようにそれらを設定すると、それだけで永遠にリダイレクトします。 Redirect Forever

私はこのようにそれらを設定した場合は、それだけの時間外:私は「

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 
    }); 
    ... 
} 

enter image description here

私はdefault HTTP/HTTPS port forwarding code in my Startup.csを持っていますこれで何日も過ごしてしまい、私はそれを働かせることができません。私は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){}行のコードを削除するのを忘れていましたが、これが原因でエラーが発生したと思います。

その後、X-Forwarded-Protoヘッダーを処理するためにthis blogを追跡しました。私は1つの拡張ファイル内のすべてのコードを配置:

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によると、httphttpsではない)の場合にのみ、X-Forwarded-Protoのヘッダーと応答をリダイレクトする必要があります。

現在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

関連する問題