2017-05-03 5 views
5

私は、ロードバランサの背後で動作し、httpsを強制する.netコア1.1アプリケーションを取得するよう努めています。私は私のStartup.cs.netコアX転送されたプロトが動作しない

public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory, IServiceProvider serviceProvider, IOptions<Auth0Settings> auth0Settings) 
{ 
    loggerFactory.AddConsole(Configuration.GetSection("Logging")); 
    loggerFactory.AddDebug(); 


    var startupLogger = loggerFactory.CreateLogger<Startup>(); 


    if (env.IsDevelopment()) 
    { 
     app.UseDeveloperExceptionPage(); 
     app.UseDatabaseErrorPage(); 
     app.UseBrowserLink(); 
     startupLogger.LogInformation("In Development"); 
    } 
    else 
    { 
     startupLogger.LogInformation("NOT in development"); 
     app.UseExceptionHandler("/Home/Error"); 
    } 

    app.UseMiddleware<HttpsRedirectMiddleware>(); 
    app.UseForwardedHeaders(new ForwardedHeadersOptions 
    { 
     ForwardedHeaders = ForwardedHeaders.XForwardedFor | ForwardedHeaders.XForwardedProto 
    });` 
     app.UseCookieAuthentication(new CookieAuthenticationOptions 
     { 
      AuthenticationScheme= CookieAuthenticationDefaults.AuthenticationScheme, 
      AutomaticAuthenticate = true, 
      AutomaticChallenge = true, 
      CookieHttpOnly = true, 
      SlidingExpiration = true 
     }); 

にHttpsRedirectMiddlewareはLBがX-転送さ-プロトセットを持って、それがない、そして唯一の値としてHTTPSとして戻ってくる検証するためである次のセットアップを持っています。私がサイト(https://myapp.somedomain.net)に行くと、私は認証されていないことを知り、私を(http://myapp.somedomain.net/Account/Logon?ReturnUrl=%2f)にリダイレクトします。それはSSL接続を失い、私のポート80に戻りました。 .netコアのドキュメントでは、以下のような "UseForwardedHeaders"を使用すると言われていますが、私の場合は動作しません。この切り替えが発生した場合、コンソールロガーにはミドルウェアからのエラーや警告はありません。短期の修正については

、私は完璧に動作しますが、ハックである上記

app.Use(async (context, next) => 
    { 
     var xproto = context.Request.Headers["X-Forwarded-Proto"].ToString(); 
     if (xproto!=null && xproto.StartsWith("https", StringComparison.OrdinalIgnoreCase)){ 
      startupLogger.LogInformation("Switched to https"); 
      context.Request.Scheme = "https"; 
     } 
     await next(); 

    }); 

「UseForwardedHeaders」の下にこれを入れています。私は正しい方法でそれをしたいと思います。

+0

が、これはトリックをしたAppHarbor上でSSLを実行しているサンプルアプリケーションを取得しようとしている日の机のに対して私の頭を叩きました。ロードバランサの背後にあるネットワークをチェックして、アプリケーションが起動するときにそれを既知のネットワークとして使用する方法があるとは思いますが、少なくとも私はそれが動作する可能性があることを知っています。ありがとう! –

+0

ネットワークをクリアすると、ポート80を介して接続し、xforwardedヘッダーを使用している人がいることをアプリケーションに知らせるので、暗号化されておらず、MiTM攻撃を強制することができます。あなたのファイアウォールがhttps(433)トラフィックだけを許可するように設定されている場合は、正常に動作するはずです。ソフトウェアはデフォルト設定のアタックを防ぐために、すぐにセキュアにする必要があります。したがって、.netコアの127.0.0.1がデフォルトです。 – Josh

答えて

6

.netコアには転送されたヘッダーの既定の設定があります。 IIS統合の場合、既定値は127.0.0.1です。ソースコードを追跡した後、既知のネットワークと既知のプロキシをクリアして、転送された要求を受け入れることができます。ファイアウォールを設定するか、既知のネットワークをプライベートサブネットにロックするのが最も良い方法です。私は完全にネットワークをクリアの意味を理解していない

var forwardingOptions = new ForwardedHeadersOptions() 
{ 
    ForwardedHeaders = ForwardedHeaders.XForwardedFor | ForwardedHeaders.XForwardedProto 
}; 
forwardingOptions.KnownNetworks.Clear(); //its loopback by default 
forwardingOptions.KnownProxies.Clear(); 
app.UseForwardedHeaders(forwardingOptions); 
+0

+1000をソースコードで掘り下げる。ありがとうございました!あなたの答えは私を助けました! –

関連する問題