Come forzare HTTPS usando un file web.config

Ho cercato in giro per Google e StackOverflow 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 è ansible utilizzare le condizioni di riscrittura per rilevare se il protocollo è HTTPS e redirect 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.

È necessario il modulo URL Rewrite, preferibilmente v2 (non ho installato v1, quindi non posso garantire che funzionerà lì, ma dovrebbe).

Ecco un esempio di tale web.config: imporrà HTTPS per TUTTE le risorse (utilizzando 301 Redirect permanente):

 < ?xml version="1.0" encoding="UTF-8"?>                 

PS Questa particolare soluzione non ha nulla a che fare con ASP.NET/PHP o con qualsiasi altra tecnologia poiché viene utilizzata solo con il modulo di riscrittura degli URL – viene elaborata a uno dei livelli iniziale / inferiore – prima che la richiesta arrivi al punto in cui il codice viene eseguito.

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:

        
  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 qui e qui . 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 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 eg cUPcTAZWKaASuYWhhneDttWpY3oBAkE3h2+soZS7sWs=", "Base64 encoded SHA-256 hash of your second backup certificate eg 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

      
  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 .

Per aumentare la risposta di LazyOne, ecco una versione commentata della risposta.

             

Cancella tutte le altre regole che potrebbero essere già state definite su questo server. Crea una nuova regola, che chiameremo “Reindirizza tutte le richieste a https”. Dopo aver elaborato questa regola, non elaborare più regole! Abbina tutti gli URL in arrivo. Quindi controlla se tutte queste altre condizioni sono vere: HTTPS è distriggersto. Bene, questa è solo una condizione (ma assicurati che sia vera). In tal caso, inviare un reindirizzamento permanente 301 al client all’indirizzo http://www.foobar.com/whatever?else=the#url-contains . Non aggiungere la stringa di query alla fine, perché duplicherebbe la stringa di query!

Questo è ciò che significano le proprietà, gli attributi e alcuni valori.

  • clear rimuove tutte le regole del server che potremmo altrimenti ereditare.
  • regola definisce una regola.
    • nominare un nome arbitrario (sebbene univoco) per la regola.
    • stopProcessing se inoltrare immediatamente la richiesta alla pipeline di richieste IIS o prima per elaborare regole aggiuntive.
  • corrisponde quando eseguire questa regola.
    • url uno schema contro cui valutare l’URL
  • condizioni aggiuntive su quando eseguire questa regola; le condizioni vengono elaborate solo se c’è una prima corrispondenza.
    • logicalGrouping se tutte le condizioni devono essere vere ( MatchAll ) o una delle condizioni deve essere true ( MatchAny ); simile a AND vs OR.
  • aggiungi aggiunge una condizione che deve essere soddisfatta.
    • inserire l’input che una condizione sta valutando; l’input può essere variabile del server.
    • definire lo standard rispetto al quale valutare l’input.
    • ignoreCase se la capitalizzazione conta o no.
  • azione cosa fare se la match e le sue conditions sono tutte vere.
    • il tipo può generalmente essere redirect (lato client) o rewrite (lato server).
    • url cosa produrre come risultato di questa regola; in questo caso, concatena https:// con due variabili del server.
    • redirectDigita quale reindirizzamento HTTP utilizzare; questo è un permanente 301.
    • appendQueryString se aggiungere o meno la stringa di query alla fine dell’URL risultante; in questo caso, lo stiamo impostando su falso, perché il {REQUEST_URI} lo include già.

Le variabili del server sono

  • {HTTPS} che è OFF o ON .
  • {HTTP_HOST} è www.mysite.com e
  • {REQUEST_URI} include il resto dell’URI, ad esempio /home?key=value
    • il browser gestisce la #fragment (vedere il commento di LazyOne).

Vedi anche: https://www.iis.net/learn/extensions/url-rewrite-module/url-rewrite-module-configuration-reference

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 qui . Il risultato è stato il seguente.

              

L’eccellente libreria NWebsec può aggiornare le tue richieste da HTTP a HTTPS usando il suo tag upgrade-insecure-requests all’interno di Web.config :

          

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

      

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

  Redirecting...     

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

 In Dot Net Core, follow the instructions at https://docs.microsoft.com/en-us/aspnet/core/security/enforcing-ssl ***In your startup.cs add the following,*** // Requires using Microsoft.AspNetCore.Mvc; public void ConfigureServices(IServiceCollection services) { services.Configure(options => { options.Filters.Add(new RequireHttpsAttribute()); });`enter code here` ***To redirect Http to Https, add the following in the startup.cs*** // Requires using Microsoft.AspNetCore.Rewrite; public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory) { loggerFactory.AddConsole(Configuration.GetSection("Logging")); loggerFactory.AddDebug(); var options = new RewriteOptions() .AddRedirectToHttps(); app.UseRewriter(options); 

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 è ansible selezionare “Richiedi SSL” per il sito (o la cartella) e questo funzionerà.