[C#] Come forzare HTTPS usando un file web.config


Answers

Per coloro che utilizzano ASP.NET MVC. Puoi utilizzare RequireHttpsAttribute per forzare tutte le risposte a essere HTTPS:

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

Altre cose che potresti voler anche fare per proteggere il tuo sito:

  1. Forza i token anti-falsificazione per utilizzare SSL / TLS:

    AntiForgeryConfig.RequireSsl = true;
    
  2. Richiedere ai cookie di richiedere HTTPS per impostazione predefinita modificando il file Web.config:

    <system.web>
        <httpCookies httpOnlyCookies="true" requireSSL="true" />
    </system.web>
    
  3. Utilizzare il pacchetto NuGet NWebSec.Owin e aggiungere la seguente riga di codice per abilitare la sicurezza del trasporto (HSTS) attraverso il sito. Non dimenticare di aggiungere la direttiva Preload qui sotto e di inviare il tuo sito al sito Preload di HSTS . Maggiori informazioni here e here . Nota che se non stai usando OWIN, c'è un metodo Web.config che puoi leggere sul sito NWebSec .

    // app is your OWIN IAppBuilder app in Startup.cs
    app.UseHsts(options => options.MaxAge(days: 720).Preload());
    
  4. Utilizzare il pacchetto NuGet NWebSec.Owin e aggiungere la seguente riga di codice per abilitare Public Key Pinning (HPKP) attraverso il sito. Maggiori informazioni here e here .

    // 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));
    
  5. Includi lo schema https in tutti gli URL utilizzati. L' intestazione HTTP di Content Security Policy (CSP) e l'integrità di sottosorgenza (SRI) non funzionano correttamente quando si imita lo schema in alcuni browser. È meglio essere espliciti su HTTPS. per esempio

    <script src="https://ajax.aspnetcdn.com/ajax/bootstrap/3.3.4/bootstrap.min.js">
    </script>
    
  6. Usa il modello di progetto Visual Studio di Boogle per MVN di ASP.NET per generare un progetto con tutto questo e molto altro ancora integrato. Puoi anche visualizzare il codice su GitHub .

Question

Ho cercato in giro per Google e cercando di trovare una soluzione a questo, ma sembrano tutti relativi a ASP.NET ecc.

Di solito eseguo Linux sui miei server, ma per questo un client sto usando Windows con IIS 7.5 (e Plesk 10). Questo è il motivo per cui non ho una certa familiarità con IIS e con i file web.config . In un file .htaccess è possibile utilizzare le condizioni di riscrittura per rilevare se il protocollo è HTTPS e reindirizzare di conseguenza. C'è un modo semplice per ottenere ciò usando un file web.config, o anche usando il modulo ' URL Rewrite ' che ho installato?

Non ho esperienza con ASP.NET quindi se questo è coinvolto nella soluzione, si prega di includere chiare istruzioni su come implementare.

Il motivo per cui sto facendo questo con web.config e non con PHP è che mi piacerebbe forzare HTTPS su tutte le risorse all'interno del sito.




La risposta accettata non ha funzionato per me. Ho seguito i passaggi su questo blog .

Un punto chiave che mi mancava era il fatto che avevo bisogno di scaricare e installare l'URL Rewrite Tool per IIS. L'ho trovato here . Il risultato è stato il seguente.

<rewrite>
        <rules>
            <remove name="Http to Https" />
            <rule name="Http to Https" enabled="true" patternSyntax="Wildcard" stopProcessing="true">
                <match url="*" />
                <conditions>
                    <add input="{HTTPS}" pattern="off" />
                </conditions>
                <serverVariables />
                <action type="Redirect" url="https://{HTTPS_HOST}{REQUEST_URI}" />
            </rule>
        </rules>
    </rewrite>



Un modo semplice è dire a IIS di inviare il tuo file di errore personalizzato per le richieste HTTP. Il file può quindi contenere un reindirizzamento meta, un reindirizzamento JavaScript e istruzioni con collegamento, ecc. È importante sottolineare che è possibile selezionare "Richiedi SSL" per il sito (o la cartella) e questo funzionerà.

</configuration>
</system.webServer>
    <httpErrors>
        <clear/>
        <!--redirect if connected without SSL-->
        <error statusCode="403" subStatusCode="4" path="errors\403.4_requiressl.html" responseMode="File"/>
    </httpErrors>
</system.webServer>
</configuration>



Non mi è stato permesso di installare URL Rewrite nel mio ambiente.

Quindi, ho trovato un altro percorso.

Aggiungendo questo al mio web.config aggiunto l'errore riscrivere e funzionato su IIS 7.5

<system.webServer>
    <httpErrors errorMode="Custom" defaultResponseMode="File" defaultPath="C:\WebSites\yoursite\" >    
    <remove statusCode="403" subStatusCode="4" />
    <error statusCode="403" subStatusCode="4" responseMode="File" path="redirectToHttps.html" />
</httpErrors>

Quindi, seguendo il consiglio qui: https://www.sslshopper.com/iis7-redirect-http-to-https.html

Ho creato il file html che esegue il reindirizzamento (redirectToHttps.html):

<html>
<head><title>Redirecting...</title></head>
<script language="JavaScript">
function redirectHttpToHttps()
{
    var httpURL= window.location.hostname + window.location.pathname + window.location.search;
    var httpsURL= "https://" + httpURL;
    window.location = httpsURL;
}
redirectHttpToHttps();
</script>
<body>
</body>
</html>

Spero che qualcuno trovi questo utile in quanto non sono riuscito a trovare tutti i pezzi in un posto altrove.