205 votes

Meilleur moyen dans asp.net pour forcer https pour un site entier?

Il y a environ 6 mois, j'ai déployé un site où chaque requête devait être sur https. À ce moment-là, le seul moyen de m'assurer que chaque requête était sur https était de le vérifier dans l'événement de chargement de la page. Si la requête n'était pas sur http, je répondrais.redirect ("https://mysite.com")

Y a-t-il une meilleure façon - idéalement une configuration dans le fichier web.config?

269voto

John Boker Points 36308

a trouvé ça

- lien mort enlevé -

fondamentalement

 protected void Application_BeginRequest(Object sender, EventArgs e)
{
   if (HttpContext.Current.Request.IsSecureConnection.Equals(false) && HttpContext.Current.Request.IsLocal.Equals(false))
   {
    Response.Redirect("https://" + Request.ServerVariables["HTTP_HOST"]
+   HttpContext.Current.Request.RawUrl);
   }
}
 

cela irait dans le global.asax.cs (ou global.asax.vb)

Je ne sais pas comment le spécifier dans le fichier web.config

127voto

Troy Hunt Points 9745

L'autre chose que vous pouvez faire est d'utiliser HSTS par le retour de la "Strict-Transport-Security" en-tête pour le navigateur. Le navigateur doit prendre en charge (et à l'heure actuelle, c'est principalement Chrome et Firefox qui n'), mais cela signifie qu'une fois réglé, le navigateur ne va pas faire des demandes sur le site via HTTP et au lieu de les traduire pour les requêtes HTTPS avant leur émission. Essayez ceci en combinaison avec une redirection à partir de l'adresse:HTTP:

protected void Application_BeginRequest(Object sender, EventArgs e)
{
  switch (Request.Url.Scheme)
  {
    case "https":
      Response.AddHeader("Strict-Transport-Security", "max-age=300");
      break;
    case "http":
      var path = "https://" + Request.Url.Host + Request.Url.PathAndQuery;
      Response.Status = "301 Moved Permanently";
      Response.AddHeader("Location", path);
      break;
  }
}

Les navigateurs qui ne sont pas HSTS conscience va simplement ignorer l'en-tête mais va encore se faire attraper par l'instruction switch et envoyé à l'adresse HTTPS.

90voto

Mark Points 5304

Le module IIS7 vous permettra de rediriger.

     <rewrite>
        <rules>
            <rule name="Redirect HTTP to HTTPS" stopProcessing="true">
                <match url="(.*)"/>
                <conditions>
                    <add input="{HTTPS}" pattern="^OFF$"/>
                </conditions>
                <action type="Redirect" url="https://{HTTP_HOST}/{R:1}" redirectType="SeeOther"/>
            </rule>
        </rules>
    </rewrite>
 

13voto

FlySwat Points 61945

Si vous ne parvenez pas à configurer cela dans IIS pour quelque raison que ce soit, je créerai un module HTTP qui effectuera la redirection pour vous:

 using System;
using System.Web;

namespace HttpsOnly
{
    /// <summary>
    /// Redirects the Request to HTTPS if it comes in on an insecure channel.
    /// </summary>
    public class HttpsOnlyModule : IHttpModule
    {
        public void Init(HttpApplication app)
        {
            // Note we cannot trust IsSecureConnection when 
            // in a webfarm, because usually only the load balancer 
            // will come in on a secure port the request will be then 
            // internally redirected to local machine on a specified port.

            // Move this to a config file, if your behind a farm, 
            // set this to the local port used internally.
            int specialPort = 443;

            if (!app.Context.Request.IsSecureConnection 
               || app.Context.Request.Url.Port != specialPort)
            {
               app.Context.Response.Redirect("https://" 
                  + app.Context.Request.ServerVariables["HTTP_HOST"] 
                  + app.Context.Request.RawUrl);    
            }
        }

        public void Dispose()
        {
            // Needed for IHttpModule
        }
    }
}
 

Ensuite, compilez-le dans une DLL, ajoutez-le comme référence à votre projet et placez-le dans web.config:

  <httpModules>
      <add name="HttpsOnlyModule" type="HttpsOnly.HttpsOnlyModule, HttpsOnly" />
 </httpModules>
 

2voto

Alexander Points 11

Cela dépend également de la marque de votre équilibreur. Pour le mux Web, vous devez rechercher l’en-tête http X-WebMux-SSL-termination: true pour déterminer que le trafic entrant était du type ssl. détails ici: http://www.cainetworks.com/support/redirect2ssl.html

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X