2009-12-16 13 views
8

Sto lavorando a un progetto che ha una pagina che deve fare uso del certificato SSL. Tutti i collegamenti del sito a questa pagina utilizzano https anziché http, ma nel caso in cui un utente possa navigare direttamente alla pagina, voglio che la versione http della pagina venga reindirizzata a se stessa, ma usi https.ASP.NET: best practice per il reindirizzamento a https

Posso eseguire un Response.Redirect nell'evento page_load. Posso scrivere javascript che aggiornerà location.href che causerà il postback. Sono sicuro che ci sono più modi per skinare questo gatto.

La mia domanda è, qual è la procedura migliore per un sito ASP.NET su IIS 6 o 7 per reindirizzare una pagina http su https? Esiste una buona pratica o tutte le alternative sono uguali?

+0

FWIW - strada dopo questo distacco, e dopo aver usato un paio di altri metodi, ho trovato la seguente discussione precedente molto utile: http://stackoverflow.com/questions/47089/best-way-in-asp-net-to-force-https-for-an-entire-site –

risposta

12

userei la riscrittura degli URL per farlo. Perché? perché è semplice da implementare, non richiede modifiche all'applicazione ed è di facile manutenzione.

Su IIS7 si può realizzare che l'utilizzo URL rewrite module, ad esempio:

<!-- http:// to https:// rule --> 
<rule name="ForceHttpsBilling" stopProcessing="true"> 
    <match url="(.*)billing/(.*)" ignoreCase="true" /> 
    <conditions> 
    <add input="{HTTPS}" pattern="off" ignoreCase="false" /> 
    </conditions> 
    <action type="Redirect" redirectType="Found" url="https://{HTTP_HOST}{REQUEST_URI}" /> 
</rule> 

Su IIS6 si dovrà utilizzare una libreria di terze parti. Io uso IIRF (http://www.codeplex.com/IIRF) è gratuito, stabile e ha una buona quantità di funzioni.

+0

Grazie per aver aggiunto un esempio di Pavel. Sono ancora su IIS6 quindi non mi sono sporcato con il modulo di riscrittura di IIS7. Sembra promettente però :) – Ariel

1

Vorrei chiamare Response.Redirect in page_load. È più semplice di generare il javascript e invierà meno byte al client.

Code example

+0

Ray - Questo è un ottimo punto su meno byte inviati quando si utilizza il CodeFile logic invece di javascript che viene inviato in ogni richiesta.Grazie –

+0

Durante il reindirizzamento tramite js devi anche pensare ai client senza js o con js disabilitato, il che renderebbe l'applicazione meno sicura. La convalida lato server è più leggera e più sicura. – Ariel

2

In realtà la migliore pratica sarebbe quella di farlo in uno dei tre punti, supponendo che l'hardware o le impostazioni IIS non siano un'opzione. Solo opzioni di codice.

  1. In un HTTPModule. HttpModules viene eseguito prima che qualsiasi richiesta venga elaborata, quindi puoi eseguire il controllo URL e reindirizzare lì. Questo è quello che farei.
  2. In Global.asax.
  3. In una pagina di base personalizzata, nella funzione init.

Tutte queste sarebbero buone opzioni. Uno e due sono garantiti per essere colpiti da ogni richiesta elaborata da ASP.NET. Il terzo richiede che tu ti assicuri che tutte le tue pagine siano ereditate dalla pagina di base.

Non inserisco il codice in ogni pagina, è solo una cattiva programmazione.

Fatemi sapere se avete bisogno di ulteriori chiarimenti, ma questo è un buon inizio.

+1

+1 risposta molto valida non ho idea del perché qualcuno abbia provato –

1

In genere, esistono parti specifiche del sito che si desidera sia sempre HTTPS o HTTP.

Io uso il seguente attributo di azione per convertire il traffico sia per uno o l'altro:

public class ForceConnectionSchemeAttribute : ActionFilterAttribute 
{ 
    private string scheme; 

    public ForceConnectionSchemeAttribute(string scheme) 
    { 
     this.scheme = scheme.ToLower(); 
    } 

    public override void OnActionExecuting(ActionExecutingContext filterContext) 
    { 
     Uri url = filterContext.HttpContext.Request.Url; 
     if (url.Scheme != scheme) 
     { 
      string secureUrl = String.Format("{0}://{1}{2}", scheme, url.Host, url.PathAndQuery); 
      filterContext.Result = new RedirectResult(secureUrl); 
     } 
    } 
} 


// Suppose I always want users to use HTTPS to access their personal info: 
[ForceConnectionScheme("https")] 
public class UserController: Controller 
{ 
    // blah 
} 
+0

Questo approccio presuppone che tu stia utilizzando MVC. –

Problemi correlati