2017-05-03 2 views
5

.net 코어 1.1 애플리케이션을로드 밸런서 뒤에두고 https를 시행하기 위해 노력하고 있습니다. 내 Startup.cs.net Core X Forwarded Proto not working

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"를 사용한다고 나와 있는데, 제 경우에는 작동하지 않습니다. 이 스위치가 발생할 때 콘솔 로거에는 미들웨어에서 오류나 경고가 없습니다. 단기 수정에 대한

, 나는 "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(); 

    }); 

위는 완벽하게 작동하지만, 해킹 이하이를 뒀다. 올바른 방법으로하고 싶습니다.

+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 소스 코드에서 파기. 고맙습니다! 당신의 대답은 제게 많은 도움이되었습니다! –