4

J'ai un site Web qui exécute HTTPS correctement dans mon environnement local. Lorsque je le télécharge vers AWS, il expire ou redirige pour toujours. Ma configuration dans AWS est une application Elastic Beanstalk, une base de données RDS exécutant MS SQL, j'ai ajouté un Load Balancer pour transférer les demandes HTTPS et j'ai un certificat SSL correctement affecté à Load Balancer. De tout ce que je peux dire que mon application est en cours d'exécution, Entity Framework a déclenché et correctement construit ma base de données dans mon instance RDS. Je ne peux tout simplement pas accéder au site via Internet..net Core - HTTPS avec AWS Load Balancer et Elastic Beanstalk ne fonctionne pas

J'ai essayé de régler les récepteurs de différentes façons. Si je les mets comme ça, il redirige tout jamais: Redirect Forever

Si je les mets comme ça, il vient de fois sur: enter image description here

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

Je J'ai passé des jours là-dessus et je n'arrive pas à le faire fonctionner. J'ai essayé de sortir tout mon code HTTPS et ça ne marche pas. J'ai essayé des solutions de code à partir de blogs comme this et this et cela ne fonctionne pas non plus. D'après ce que j'ai lu, l'équilibreur de charge finit par gérer la requête HTTPS, puis transmet une requête HTTP à mon application. Mais je ne sais pas comment gérer correctement cela, toujours appliquer HTTPS, et rediriger HTTP vers HTTPS.

Cela semble être quelque chose qui ne fonctionnerait pas sans un tas de réglages de ma part. Si ce n'est pas, je pense que beaucoup d'autres personnes auraient déjà rencontré ce problème et il y aurait des infos à ce sujet sur internet. Est-ce que je manque quelque chose de petit? Parce que je suis complètement à la fin de mon esprit à ce sujet.

Si vous pouvez répondre à cette question, vous serez mon nouveau héros.

+0

Pouvez-vous confirmer, Si loadbalancer est connecté à Internet? Vous pouvez voir ce détail dans l'onglet Description – Shantanu

+0

Oui, l'équilibreur de charge est "connecté à Internet". – Pinski

Répondre

6

J'ai donc finalement résolu ce problème. Tout d'abord, l'équilibreur de charge doit être configuré pour renvoyer HTTPS 443 à HTTP 80 comme ceci: enter image description here

Ensuite, tout le code que je l'ai indiqué dans ma question doit être supprimé (ou ne fonctionne pas dans l'environnement AWS) . J'ai oublié de supprimer les lignes de code services.Configure<MvcOptions>(options){} initialement et je crois que c'était ce qui causait l'erreur.

Puis j'ai suivi this blog pour gérer l'en-tête X-Forwarded-Proto. Je mets tout le code dans un fichier d'extension:

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

Enfin, j'appelle ce code dans Startup.cs:

public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory) 
{ 
    ... 
    var options = new RewriteOptions() 
     .AddRedirectToProxiedHttps() 
     .AddRedirect("(.*)/$", "$1"); // remove trailing slash 
    app.UseRewriter(options); 
    ... 
} 

Après tout ce qu'il a finalement fonctionné!

+0

Merci. J'ai finalement eu ça pour travailler. J'ai modifié la page HealthCheck du fichier par défaut/en un fichier html (par exemple, HealthCheck.html). –

3

Selon this AWS docs vous devez analyser en-tête X-Forwarded-Proto et la réponse avec des redirections uniquement lorsqu'il est http (pas https).

Courant RedirectToHttpsRule du Microsoft.AspNetCore.Rewrite package fait not analyze this. Vous devez implémenter votre propre IRule.

+0

J'ai donc essayé d'analyser l'en-tête X-Forwarded-Proto en suivant [ce blog] (http://blog.treeloop.com/asp-net-core- url-rewrite-module-behind-load-balancer/) comme guide . Je ne pouvais toujours pas le faire fonctionner. – Pinski

+0

Vous avez travaillé avec un peu plus de diligence en suivant l'exemple des blogs. Merci pour votre contribution et votre aide. – Pinski

0

app.UseForwardedHeaders() semble avoir des problèmes avec AWS Load Balancers sauf si vous désactivez les réseaux et les proxys connus en premier. N'oubliez pas d'installer d'abord le package Microsoft.AspNetCore.HttpOverrides NuGet sinon il échouera silencieusement.

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

J'ai essayé ceci et cela n'a pas réglé le problème. Ma solution a cependant résolu le problème. J'utilise une ancienne version de Microsoft.AspNetCore.HttpOverrides (1.1.2), cela pourrait-il être un problème? – Pinski

+0

Ouais cela gère le bon protocole de l'en-tête X-Forwarded-For pour la plupart des middleware, mais apparemment pas pour Rewrite.AddRedirectToHttps J'ai fini par devoir utiliser votre solution moi-même :) mais je devais le changer un peu pour ne pas rediriger http: // si l'en-tête X-Forwarded-Proto était manquant. De cette façon, mon bilan de santé Load Balancer n'a pas été redirigé vers https. – ArcadeRenegade