Question

Environ 6 mois, j'ai lancé un site où chaque requête devait être sur https.Le seul moyen à l'heure j'ai pu trouver à s'assurer que chaque demande de page sur https a été vérifier dans le chargement de la page de l'événement.Si la demande n'a pas été sur http, j'aurais la réponse.redirect("https://example.com")

Est-il une meilleure façon de -- idéalement, certains paramètre dans le web.config?

Était-ce utile?

La solution

Veuillez utiliser HSTS

à partir de http://www.hanselman.com/blog/HowToEnableHTTPStrictTransportSecurityHSTSInIIS7.aspx

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <system.webServer>
        <rewrite>
            <rules>
                <rule name="HTTP to HTTPS redirect" stopProcessing="true">
                    <match url="(.*)" />
                    <conditions>
                        <add input="{HTTPS}" pattern="off" ignoreCase="true" />
                    </conditions>
                    <action type="Redirect" url="https://{HTTP_HOST}/{R:1}"
                        redirectType="Permanent" />
                </rule>
            </rules>
            <outboundRules>
                <rule name="Add Strict-Transport-Security when HTTPS" enabled="true">
                    <match serverVariable="RESPONSE_Strict_Transport_Security"
                        pattern=".*" />
                    <conditions>
                        <add input="{HTTPS}" pattern="on" ignoreCase="true" />
                    </conditions>
                    <action type="Rewrite" value="max-age=31536000" />
                </rule>
            </outboundRules>
        </rewrite>
    </system.webServer>
</configuration>

Réponse Originale À Cette Question (remplacé le ci-dessus le 4 décembre 2015)

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

qui irait dans le monde.asax.cs (ou global).asax.vb)

je ne sais pas de manière à spécifier dans le web.config

Autres conseils

L'autre chose que vous pouvez faire est d'utiliser HSTS en retournant le "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.

Le IIS7 module va vous permettre 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>

Pour ceux qui l'utilisent ASP.NET MVC.Vous pouvez utiliser les méthodes suivantes pour forcer SSL/TLS sur le HTTPS sur l'ensemble du site de deux façons:

La Dure

1 - Ajouter la RequireHttpsAttribute pour les filtres globaux:

GlobalFilters.Filters.Add(new RequireHttpsAttribute());

2 - la Force d'Anti-Contrefaçon jetons pour utiliser SSL/TLS:

AntiForgeryConfig.RequireSsl = true;

3 - Requièrent l'utilisation de Cookies pour exiger HTTPS par défaut en modifiant le Web.fichier de configuration:

<system.web>
    <httpCookies httpOnlyCookies="true" requireSSL="true" />
</system.web>

4 - Utiliser le NWebSec.Owin package NuGet et ajouter la ligne de code suivante pour activer Strict de la Sécurité des Transports à travers le site.N'oubliez pas d'ajouter de la Précharge de la directive ci-dessous et soumettre votre site à l' HSTS Précontrainte site.Plus d'informations ici et ici.Notez que si vous n'êtes pas à l'aide de OWIN, il y a un Web.config méthode que vous pouvez lire sur le NWebSec site.

// app is your OWIN IAppBuilder app in Startup.cs
app.UseHsts(options => options.MaxAge(days: 30).Preload());

5 - Utiliser le NWebSec.Owin package NuGet et ajoutez la ligne suivante de code pour activer le Public Key Pinning (HPKP) à travers le site.Plus d'informations ici et ici.

// app is your OWIN IAppBuilder app in Startup.cs
app.UseHpkp(options => options
    .Sha256Pins(
        "Base64 encoded SHA-256 hash of your first certificate e.g. cUPcTAZWKaASuYWhhneDttWpY3oBAkE3h2+soZS7sWs=",
        "Base64 encoded SHA-256 hash of your second backup certificate e.g. M8HztCzM3elUxkcjR2S5P4hhyBNf6lHkmjAHKhpGPWE=")
    .MaxAge(days: 30));

6 - Inclure le https régime dans toute l'URL est utilisée. Contenu de la Politique de Sécurité (CSP) L'en-tête HTTP et Sous-ressource de l'Intégrité (SRI) ne jouez pas agréable quand vous imit le régime dans certains navigateurs.Il est préférable d'être explicite sur HTTPS.par exemple

<script src="https://ajax.aspnetcdn.com/ajax/bootstrap/3.3.4/bootstrap.min.js"></script>

La Voie De La Facilité

L'utilisation de la ASP.NET MVC Réutilisable Modèle de projet Visual Studio pour générer un projet avec tout cela, et beaucoup plus construit en.Vous pouvez également consulter le code sur GitHub.

Si vous ne parvenez pas à configurer IIS pour quelque raison que ce soit, je ferais un module HTTP qui effectue 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
        }
    }
}

Puis il suffit de le compiler une DLL, ajouter une référence à votre projet et de le placer dans le web.config:

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

Ce que vous devez faire est de :

1) Ajouter une touche à l'intérieur de web.config, en fonction de la production ou de la scène serveur comme ci-dessous

<add key="HttpsServer" value="stage"/>
             or
<add key="HttpsServer" value="prod"/>

2) à l'Intérieur de votre Global.asax fichier ajouter de la méthode ci-dessous.

void Application_BeginRequest(Object sender, EventArgs e)
{
    //if (ConfigurationManager.AppSettings["HttpsServer"].ToString() == "prod")
    if (ConfigurationManager.AppSettings["HttpsServer"].ToString() == "stage")
    {
        if (!HttpContext.Current.Request.IsSecureConnection)
        {
            if (!Request.Url.GetLeftPart(UriPartial.Authority).Contains("www"))
            {
                HttpContext.Current.Response.Redirect(
                    Request.Url.GetLeftPart(UriPartial.Authority).Replace("http://", "https://www."), true);
            }
            else
            {
                HttpContext.Current.Response.Redirect(
                    Request.Url.GetLeftPart(UriPartial.Authority).Replace("http://", "https://"), true);
            }
        }
    }
}

Si la prise en charge SSL n'est pas configurable dans votre site (c'est à dire.doit être capable de tourner https activé/désactivé) - vous pouvez utiliser le bouton [RequireHttps] attribut sur n'importe quel controller / contrôleur de l'action que vous souhaitez sécuriser.

Elle dépend aussi de la marque de votre équilibreur, pour le web mux, vous devez regarder pour les en-tête http X-WebMux-SSL-termination: true à la figure que le trafic entrant est ssl.plus de détails ici: http://www.cainetworks.com/support/redirect2ssl.html

Pour @Joe ci-dessus, "Ce qui me donne une redirection en boucle.Avant j'ai ajouté le code a bien fonctionné.Toutes les suggestions?– Joe 8 Nov '11 à 4:13"

Ce qui se passait pour moi aussi et je crois que ce qui se passait c'est qu'il y a un équilibrage de la charge de terminaison SSL demande devant le serveur Web.Donc, mon site Web est toujours en train de penser que la demande est "http", même si le navigateur d'origine a demandé d'être "https".

J'avoue que c'est très orthodoxe, mais ce qui a fonctionné pour moi a été de mettre en œuvre un "JustRedirected" bien que je pouvais l'effet de levier pour comprendre la personne a déjà été redirigé une fois.Donc, je test pour des conditions spécifiques qui justifient la redirection et, si elles sont respectées, j'ai défini cette propriété (valeur stockée dans la session) avant la redirection.Même si le http/https conditions pour la redirection sont remplies, la deuxième fois, j'ai contourner la redirection de la logique et de réinitialiser le "JustRedirected" session de la valeur à false.Vous aurez besoin de votre propre test conditionnel logique, mais ici, c'est une simple mise en œuvre de la propriété:

    public bool JustRedirected
    {
        get
        {
            if (Session[RosadaConst.JUSTREDIRECTED] == null)
                return false;

            return (bool)Session[RosadaConst.JUSTREDIRECTED];
        }
        set
        {
            Session[RosadaConst.JUSTREDIRECTED] = value;
        }
    }

Je vais jeter mon grain de sel. SI vous avez accès à un serveur IIS côté, alors vous pouvez forcer le HTTPS par l'utilisation de liaisons de protocole.Par exemple, vous avez un site web appelé Bla.Dans IIS, vous auriez installation de deux sites: Bla, et Bla (Redirection).Pour Bla configurer uniquement les HTTPS de liaison (et FTP si vous en avez besoin, assurez-vous de le forcer via une connexion sécurisée ainsi).Pour Bla (Redirection) configurer uniquement les HTTP de liaison.Enfin, dans le Redirection HTTP la section pour Bla (Redirection) assurez-vous de définir une redirection 301 pour https://blah.com, avec destination exacte activé.Assurez-vous que chaque site dans IIS vers elle propre dossier racine sinon le Web.config obtenez toutes les vissé vers le haut.Assurez-vous également d'avoir HSTS configuré sur votre HTTPSed site, de sorte que les demandes ultérieures par le navigateur sont toujours obligés de HTTPS et aucune redirection se produire.

C'est une meilleure réponse repose sur @Troy Hunt.Ajouter cette fonction à votre WebApplication classe Global.asax.cs:

    protected void Application_BeginRequest(Object sender, EventArgs e)
    {
        // Allow https pages in debugging
        if (Request.IsLocal)
        {
            if (Request.Url.Scheme == "http")
            {
                int localSslPort = 44362; // Your local IIS port for HTTPS

                var path = "https://" + Request.Url.Host + ":" + localSslPort + Request.Url.PathAndQuery;

                Response.Status = "301 Moved Permanently";
                Response.AddHeader("Location", path);
            }
        }
        else
        {
            switch (Request.Url.Scheme)
            {
                case "https":
                    Response.AddHeader("Strict-Transport-Security", "max-age=31536000");
                    break;
                case "http":
                    var path = "https://" + Request.Url.Host + Request.Url.PathAndQuery;
                    Response.Status = "301 Moved Permanently";
                    Response.AddHeader("Location", path);
                    break;
            }
        }
    }

(Pour activer SSL sur votre construire l'activer dans les Propriétés de dock pour le projet)

-> AJOUTEZ simplement [RequireHttps] sur le dessus du public de la classe HomeController :Le contrôleur.

-> Et ajouter GlobalFilters.Les filtres.Add(new RequireHttpsAttribute());dans " protégés vide Application_Start()' méthode Globale.asax.cs fichier.

Ce qui oblige l'ensemble de votre application pour HTTPS.

J'ai passé quelque temps à la recherche pour les meilleures pratiques qui ont du sens et trouvé à l'issue de laquelle a travaillé amené à la perfection pour moi.J'espère que cela va vous sauver de temps en temps.

À l'aide de Fichier de configuration (par exemple un asp.net le site web) https://blogs.msdn.microsoft.com/kaushal/2013/05/22/http-to-https-redirects-on-iis-7-x-and-higher/

ou sur votre propre serveur https://www.sslshopper.com/iis7-redirect-http-to-https.html

[RÉPONSE COURTE] Tout simplement Le code ci-dessous va à l'intérieur de

<system.webServer> 
 <rewrite>
     <rules>
       <rule name="HTTP/S to HTTPS Redirect" enabled="true" 
           stopProcessing="true">
       <match url="(.*)" />
        <conditions logicalGrouping="MatchAny">
        <add input="{SERVER_PORT_SECURE}" pattern="^0$" />
       </conditions>
       <action type="Redirect" url="https://{HTTP_HOST}{REQUEST_URI}" 
        redirectType="Permanent" />
        </rule>
       </rules>
 </rewrite>

Si vous utilisez ASP.NET Core, vous pourriez essayer le package nuget SaidOut.AspNetCore.HttpsWithStrictTransportSecurity.

Ensuite, vous n'aurez qu'à ajouter

app.UseHttpsWithHsts(HttpsMode.AllowedRedirectForGet, configureRoutes: routeAction);

Ce sera également ajouter HTTP StrictTransportSecurity-tête à toutes les demandes faites à l'aide de https régime.

Exemple de code et de documentation https://github.com/saidout/saidout-aspnetcore-httpswithstricttransportsecurity#example-code

Dans IIS10 (Windows 10 et le Serveur 2016), à partir de la version à partir de 1709, il y a un nouveau, plus simple option pour l'activation de HSTS pour un site web.

Microsoft décrire les avantages de la nouvelle approche ici, et de fournir de nombreux exemples de la façon de mettre en œuvre le changement par programme ou en modifiant directement le ApplicationHost.fichier de configuration (qui est comme le web.config mais opère au niveau de IIS, plutôt que de chaque site).ApplicationHost.config peut être trouvé dans C:\Windows\System32\inetsrv\config.

J'ai décrit deux exemples de méthodes afin d'éviter la pourriture des liens.

Méthode 1 - Modifier le ApplicationHost.fichier de configuration directement Entre le <site> tags, ajouter cette ligne:

<hsts enabled="true" max-age="31536000" includeSubDomains="true" redirectHttpToHttps="true" />

Méthode 2 - Ligne De Commande:Exécutez la commande suivante à partir d'une invite de commande élevée (c'est à diredroit de la souris sur CMD et exécuter en tant qu'administrateur).N'oubliez pas de swap Contoso avec le nom de votre site tel qu'il apparaît dans le Gestionnaire des services IIS.

c:
cd C:\WINDOWS\system32\inetsrv\
appcmd.exe set config -section:system.applicationHost/sites "/[name='Contoso'].hsts.enabled:True" /commit:apphost
appcmd.exe set config -section:system.applicationHost/sites "/[name='Contoso'].hsts.max-age:31536000" /commit:apphost
appcmd.exe set config -section:system.applicationHost/sites "/[name='Contoso'].hsts.includeSubDomains:True" /commit:apphost
appcmd.exe set config -section:system.applicationHost/sites "/[name='Contoso'].hsts.redirectHttpToHttps:True" /commit:apphost

Les autres méthodes de Microsoft offre en ce que les articles peuvent être de meilleures options si vous êtes hébergé sur un environnement où vous avez un accès limité.

Gardez à l'esprit que IIS10 version 1709 est disponible sur Windows 10, mais pour Windows Server 2016, il est sur une autre version de la piste, et ne pourra pas être diffusé sous forme de patch ou d'un service pack.Voir ici pour plus de détails à propos de 1709.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top