Domanda

Circa 6 mesi fa ho lanciato un sito in cui ogni richiesta doveva essere su https.L'unico modo che ho trovato in quel momento per assicurarmi che ogni richiesta a una pagina fosse su https era controllarla nell'evento di caricamento della pagina.Se la richiesta non fosse su http, risponderei.redirect("https://esempio.com")

Esiste un modo migliore: idealmente alcune impostazioni nel web.config?

È stato utile?

Soluzione

Si prega di utilizzare HSTS

da 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>

Risposta originale (sostituito con il precedente il 4 dicembre 2015)

fondamentalmente

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

andrebbe in global.asax.cs (o global.asax.vb)

non conosco un modo per specificarlo nel web.config

Altri suggerimenti

L'altra cosa che puoi fare è usare HSTS restituendo l'intestazione "Strict-Transport-Security" al browser.Il browser deve supportare questo (e al momento sono principalmente Chrome e Firefox a farlo), ma significa che una volta impostato, il browser non effettuerà richieste al sito tramite HTTP e le tradurrà invece in richieste HTTPS prima di emetterle .Prova questo in combinazione con un reindirizzamento da 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;
  }
}

I browser che non sono a conoscenza di HSTS ignoreranno semplicemente l'intestazione ma verranno comunque catturati dall'istruzione switch e inviati a HTTPS.

Il modulo IIS7 ti consentirà di reindirizzare.

    <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>

Per coloro che utilizzano ASP.NET MVC.Puoi utilizzare quanto segue per forzare SSL/TLS su HTTPS sull'intero sito in due modi:

Il modo difficile

1 - Aggiungi RequireHttpsAttribute ai filtri globali:

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

2 - Forza i token anti-falsificazione a utilizzare SSL/TLS:

AntiForgeryConfig.RequireSsl = true;

3 - Richiedi ai cookie di richiedere HTTPS per impostazione predefinita modificando il file Web.config:

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

4: utilizzare il pacchetto NWebSec.Owin NuGet e aggiungere la seguente riga di codice per abilitare Strict Transport Security nel sito.Non dimenticare di aggiungere la direttiva Preload di seguito e di inviare il tuo sito a Sito di precarico HSTS.Maggiori informazioni Qui E Qui.Tieni presente che se non stai utilizzando OWIN, esiste un metodo Web.config di cui puoi leggere il file NWebSec luogo.

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

5: utilizzare il pacchetto NWebSec.Owin NuGet e aggiungere la seguente riga di codice per abilitare il pinning a chiave pubblica (HPKP) nel sito.Maggiori informazioni Qui E Qui.

// 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 - Includere lo schema https in qualsiasi URL utilizzato. Politica di sicurezza dei contenuti (CSP) Intestazione HTTP e Integrità delle sottorisorse (SRI) non giocare bene quando imiti lo schema in alcuni browser.È meglio essere espliciti riguardo a HTTPS.per esempio.

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

Il modo semplice

Usa il Boiler ASP.NET MVC Modello di progetto di Visual Studio per generare un progetto con tutto questo e molto altro ancora integrato.Puoi anche visualizzare il codice su GitHub.

Se non riesci a configurarlo in IIS per qualsiasi motivo, creerei un modulo HTTP che esegua il reindirizzamento per te:

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

Quindi compilalo in una DLL, aggiungilo come riferimento al tuo progetto e inseriscilo in web.config:

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

Quello che devi fare è:

1) Aggiungi una chiave all'interno di web.config, a seconda del server di produzione o di stage come di seguito

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

2) All'interno del file Global.asax aggiungi il metodo seguente.

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

Se il supporto SSL non è configurabile nel tuo sito (es.dovrebbe essere in grado di attivare/disattivare https): puoi utilizzare l'attributo [RequireHttps] su qualsiasi controller/azione del controller che desideri proteggere.

Dipende anche dalla marca del tuo bilanciatore, per il web mux dovresti cercare l'intestazione http X-WebMux-SSL-termination: true per capire che il traffico in entrata era SSL.dettagli qui: http://www.cainetworks.com/support/redirect2ssl.html

Per @Joe sopra, "Questo mi sta dando un ciclo di reindirizzamento.Prima di aggiungere il codice funzionava bene.Eventuali suggerimenti?– Joe l'8 nov.

Questo stava succedendo anche a me e quello che credo stesse succedendo è che c'era un bilanciatore del carico che terminava la richiesta SSL davanti al server Web.Quindi, il mio sito Web pensava sempre che la richiesta fosse "http", anche se il browser originale richiedeva che fosse "https".

Ammetto che è un po' complicato, ma ciò che ha funzionato per me è stato implementare una proprietà "JustRedirected" che potevo sfruttare per capire che la persona era già stata reindirizzata una volta.Pertanto, provo le condizioni specifiche che garantiscono il reindirizzamento e, se vengono soddisfatte, imposto questa proprietà (valore archiviato nella sessione) prima del reindirizzamento.Anche se le condizioni http/https per il reindirizzamento vengono soddisfatte la seconda volta, ignoro la logica di reindirizzamento e reimposta il valore della sessione "JustRedirected" su false.Avrai bisogno della tua logica di test condizionale, ma ecco una semplice implementazione della proprietà:

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

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

Metto i miei due centesimi. SE hai accesso al lato server IIS, quindi puoi forzare HTTPS utilizzando i collegamenti del protocollo.Ad esempio, hai un sito web chiamato Bla.In IIS dovresti configurare due siti: Bla, E Bla (Reindirizzamento).Per Bla configurare solo il HTTPS vincolante (e FTP se necessario, assicurati di forzarlo anche su una connessione sicura).Per Bla (Reindirizzamento) configurare solo il HTTP legame.Infine, nel Reindirizzamento HTTP sezione per Bla (Reindirizzamento) assicurati di impostare un reindirizzamento 301 su https://blah.com, con la destinazione esatta abilitata.Assicurati che ogni sito in IIS punti a esso Proprio cartella root altrimenti il Web.config finirà tutto incasinato.Assicurati anche di averlo HSTS configurato sul tuo sito HTTPSed in modo che le richieste successive da parte del browser siano sempre forzate su HTTPS e non si verifichino reindirizzamenti.

Questa è una risposta più completa basata su quella di @Troy Hunt.Aggiungi questa funzione al tuo WebApplication classe dentro 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;
            }
        }
    }

(Per abilitare SSL sulla build locale abilitalo nel dock Proprietà per il progetto)

-> Basta AGGIUNGERE [RequireHttps] sopra la classe pubblica HomeController:Controllore.

-> E aggiungi GlobalFilters.Filters.Add(new RequireHttpsAttribute());nel metodo 'protected void Application_Start()' nel file Global.asax.cs.

Che forza l'intera applicazione su HTTPS.

Ho passato del tempo a cercare le migliori pratiche che avessero senso e ho trovato le seguenti che funzionavano perfettamente per me.Spero che questo ti salvi prima o poi.

Utilizzando File di configurazione (ad esempio un sito Web asp.net)https://blogs.msdn.microsoft.com/kaushal/2013/05/22/http-to-https-redirects-on-iis-7-x-and-higher/

o sul tuo serverhttps://www.sslshopper.com/iis7-redirect-http-to-https.html

Risposta breve] semplicemente il codice seguente entra

<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>

Se utilizzi ASP.NET Core puoi provare il pacchetto nuget SaidOut.AspNetCore.HttpsWithStrictTransportSecurity.

Quindi devi solo aggiungere

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

Ciò aggiungerà anche l'intestazione HTTP StrictTransportSecurity a tutte le richieste effettuate utilizzando lo schema https.

Codice di esempio e documentazione https://github.com/saidout/saidout-aspnetcore-httpswithstricttransportsecurity#example-code

In IIS10 (Windows 10 e Server 2016), dalla versione 1709 in poi, è disponibile una nuova opzione più semplice per abilitare HSTS per un sito Web.

Microsoft descrive i vantaggi del nuovo approccio Qui, e fornire molti esempi diversi di come implementare la modifica a livello di codice o modificando direttamente il file ApplicationHost.config (che è come web.config ma funziona a livello di IIS, anziché a livello di singolo sito).ApplicationHost.config si trova in C:\Windows\System32\inetsrv\config.

Ho delineato due dei metodi di esempio qui per evitare il marciume dei collegamenti.

Metodo 1 - Modifica il file applicationhost.config direttamente tra il <site> tag, aggiungi questa riga:

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

Metodo 2 - Riga di comando:Esegui quanto segue da un prompt dei comandi con privilegi elevati (ad es.tasto destro del mouse su CMD ed esegui come amministratore).Ricordarsi di scambiare Contoso con il nome del sito così come appare in Gestione 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

Gli altri metodi offerti da Microsoft in questi articoli potrebbero essere opzioni migliori se ti trovi in ​​un ambiente ospitato in cui hai accesso limitato.

Tieni presente che la versione 1709 di IIS10 è ora disponibile su Windows 10, ma per Windows Server 2016 si trova su un percorso di rilascio diverso e non verrà rilasciato come patch o service pack.Vedere Qui per dettagli sul 1709.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top