Il modo migliore in asp.net per forzare https per un intero sito?

Circa 6 mesi fa ho lanciato un sito in cui ogni richiesta doveva essere superiore a https. L’unico modo in cui riuscivo a trovare per garantire che ogni richiesta di una pagina fosse scaduta su https era di controllarla nell’evento di caricamento della pagina. Se la richiesta non fosse superiore a http, avrei response.redirect (” https://example.com “)

C’è un modo migliore – idealmente qualche impostazione nel web.config?

Si prega di utilizzare HSTS

da http://www.hanselman.com/blog/HowToEnableHTTPStrictTransportSecurityHSTSInIIS7.aspx

                         

Risposta originale (sostituita con quanto sopra 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); } } 

quello andrebbe nel global.asax.cs (o global.asax.vb)

Non sono a conoscenza di un modo per specificarlo nel web.config

L’altra cosa che puoi fare è usare HSTS restituendo l’intestazione “Strict-Transport-Security” al browser. Il browser deve supportare questo (e al momento, è principalmente Chrome e Firefox che lo fanno), ma significa che una volta impostato, il browser non invierà richieste al sito tramite HTTP e invece le tradurrà 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 dell’HST ignoreranno semplicemente l’intestazione ma verranno comunque catturati dall’istruzione switch e inviati a HTTPS.

Il modulo IIS7 ti permetterà di redirect.

             

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

La via difficile

1 – Aggiungi il RequireHttpsAttribute ai filtri globali:

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

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

 AntiForgeryConfig.RequireSsl = true; 

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

    

4 – Utilizzare il pacchetto NuGet di NWebSec.Owin e aggiungere la seguente riga di codice per abilitare la sicurezza del trasporto rigido 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: 30).Preload()); 

5 – Utilizzare il pacchetto NuGet di 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)); 

6 – Includere lo schema https in qualsiasi URL utilizzato. 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

  

La via facile

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 .

Se non sei in grado di configurarlo in IIS per qualsiasi motivo, creo un modulo HTTP che esegue il reindirizzamento per te:

 using System; using System.Web; namespace HttpsOnly { ///  /// Redirects the Request to HTTPS if it comes in on an insecure channel. ///  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 basta compilarlo in una DLL, aggiungerlo come riferimento al progetto e inserirlo in web.config:

     

Quello che devi fare è:

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

  or  

2) All’interno del tuo file Global.asax aggiungi sotto il metodo.

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

Dipende anche dalla marca del tuo bilanciatore, per il web mux, dovresti cercare l’header 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 aver aggiunto il codice ha funzionato bene.Qualsiasi suggerimento? – Joe 8 novembre 11 alle 4:13”

Questo stava accadendo anche a me e quello che credo stia accadendo è che c’era un bilanciamento del carico che termina 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 questo è un po ‘hacky, ma quello che ha funzionato per me è stato implementare una proprietà “JustRedirected” che avrei potuto sfruttare per capire che la persona era già stata reindirizzata una volta. Quindi, cerco condizioni specifiche che garantiscano il reindirizzamento e, se soddisfatte, imposto questa proprietà (valore memorizzato in 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 di 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; } } 

Se il supporto SSL non è configurabile nel tuo sito (cioè dovrebbe essere in grado di triggersre / distriggersre https), puoi utilizzare l’attributo [RequireHttps] su qualsiasi azione del controller / controller che desideri proteggere.

Inserirò i miei due centesimi. Se hai accesso al lato server di IIS, puoi forzare HTTPS usando i binding del protocollo. Ad esempio, hai un sito web chiamato Blah . In IIS avresti impostato due siti: Blah e Blah (Redirect) . Per Blah configurare solo il binding HTTPS (e FTP se necessario, assicurarsi di forzarlo su una connessione sicura). Per Blah (Redirect) configurare solo il binding HTTP . Infine, nella sezione HTTP Redirect per Blah (Redirect) assicurati di impostare un reindirizzamento 301 su https://blah.com , con la destinazione esatta abilitata. Assicurati che ogni sito in IIS stia puntando alla sua cartella radice altrimenti il Web.config sarà tutto rovinato. Assicurati inoltre di configurare HSTS 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 @Troy Hunt’s. Aggiungi questa funzione alla tua class WebApplication in 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 sul build locale, abilitarlo nel dock Proprietà per il progetto)

-> Semplicemente AGGIUNGI [RequireHttps] sopra la class pubblica HomeController: Controller.

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

Quale forza l’intera applicazione su HTTPS.

Se si utilizza ASP.NET Core, è ansible 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