RequireHttps powoduje pętlę przekierowania na Amazon Elastic Load Balancer

Mam aplikację ASP.NET MVC 4 działającą za elastycznym systemem równoważenia obciążenia Amazon. Wszystko działa dobrze, gdy instaluję certyfikat SSL na równoważniku obciążeniai serwer WWW i zakończyć SSL na warstwie serwera WWW.

Jednak gdy próbuję zakończyć działanie na warstwie równoważenia obciążenia, przekazując ruch wewnętrzny z systemu równoważenia obciążenia na serwery WWW niezaszyfrowane na porcie 80, atrybut RequireHttps powoduje pętlę przekierowania. Wydaje się to mieć sens, ponieważ prosi o zaszyfrowany kanał i nie wie, że ma taki kanał (między przeglądarką a systemem równoważenia obciążenia). Czy ktoś wpadł na ten sam problem? Wszelkie sugestie będą mile widziane!

Edytuj: rozwiązanie

Poniższe linki mogą być przydatne dla każdego, kto ma do czynienia z tym problemem:

MVC3, RequireHttps i niestandardowy program obsługi skutkują http 310

https://gist.github.com/915869

questionAnswers(3)

QuestionSolution

Wydaje się, że aby skorzystać z tej funkcji w AWS, spójrz na element nagłówka HTTP „X-Forwarded-Proto”. Jeśli początkowym żądaniem jest HTTPS, moduł równoważenia obciążenia wstrzykuje nagłówek i mówi „https”. Jeśli jest to HTTP, mówi „http”.

Odpowiedź znaleziona tutaj:http://aws.typepad.com/aws/2010/10/keeping-customers-happy-another-new-elastic-load-balancer-feature.html

Dostarczyłem rozwiązanie tego w następującym linku:https://stackoverflow.com/questions/37954796/requirehttpsattribute-with-netcore-rc2-causes-http302-redirect-loop-on-azure#=

Który mówi:

Możesz obejść ten problem, dodając następujące linie do ConfigureServices w Startup.cs (i dodaj „używając Microsoft.AspNetCore.HttpOverrides;”)

services.Configure<ForwardedHeadersOptions>(options =>
        {
            options.ForwardedHeaders = ForwardedHeaders.XForwardedProto;
        });

Wystąpił ten sam problem. Odkryłem, że następujący filtr RequireHttpsAttribute działał dla mnie.

public class SSLFilter : RequireHttpsAttribute
{
    public override void OnAuthorization(AuthorizationContext filterContext)
    {
        if (filterContext == null)
        {
            throw new ArgumentNullException("filterContext");
        }

        if (filterContext.HttpContext.Request.IsLocal ||
            (filterContext.RequestContext.HttpContext.Request.Headers.AllKeys.Contains("X-Forwarded-Proto") &&
            filterContext.RequestContext.HttpContext.Request.Headers.Get("X-Forwarded-Proto").ToLower().Equals("https")))
        {
            return;
        }

        base.OnAuthorization(filterContext);
    }
}
 Damian Green12 wrz 2016, 12:32
Zaimplementowałem to i dostałem „zbyt długo, by odpowiedzieć”. Czy brakuje mi czegoś innego?

yourAnswerToTheQuestion