2009-03-26 14 views
6

Come faccio a garantire che i miei utenti non possano digitare fisicamente in http: per ignorare il mio SSL e garantire che ogni pagina sia https :?Accedere alla pagina solo tramite SSL

Forse un reindirizzamento sulla mia pagina principale?

risposta

9

Questo sarebbe generalmente essere gestiti tramite la configurazione di IIS o con un filtro ISAPI, ma se si vuole farlo nel codice dell'applicazione, si potrebbe mettere qualcosa di simile nel caso Page_Init della vostra pagina master ...

If Not Request.IsSecure 
    Response.Redirect(Request.Url.AbsoluteUri.Replace("http://", "https://")) 
End If 
+2

Non le migliori idee. Stai facendo un reindirizzamento lato client alla pagina chiamante. Se non esiste un certificato SSL per qualsiasi motivo (senza certificato o certificato errato) entrerai in un ciclo ricorsivo. Una scelta migliore sarebbe quella di reindirizzare a una pagina di errore in quanto l'utente non dovrebbe entrare in un sito/pagina di sicurezza a meno che il codice non lo faccia in modo errato o stiano giocando con l'URL. –

+1

Questo funziona bene con l'avvertenza che il metodo string.replace cambierà tutte le occorrenze di "http: //" in "https: //", non solo lo schema iniziale. Cioè potrebbe interferire con i parametri della stringa di query. –

+0

@Daniel se si hanno i caratteri: o/nelle stringhe della query, si avranno altri problemi di cui preoccuparsi;) –

2

Vorrei semplicemente reindirizzare tutti gli URL http a https con una pagina separata o utilizzare l'opzione "richiede canale sicuro" nella configurazione di IIS, che visualizzerà un errore se qualcuno tenta di accedere a una pagina non-https.

Here's un sito con una guida per reindirizzare la pagina di errore all'URL https del sito.

+0

Fare questo a livello di server Web è di gran lunga la scelta migliore. Offre una maggiore flessibilità lungo il percorso se si introduce l'hardware di bilanciamento del carico SSL in particolare. –

0
if(!String.Equals(Request.Url.Scheme, 
        "https", 
        StringComparison.OrdinalIgnoreCase)) { } 
+0

Questa è una proprietà di sola lettura: vedere http://msdn.microsoft.com/en-us/library/system.uri.scheme.aspx – Rich

+0

Sì, lo è. Va bene per il confronto delle stringhe, no? – abatishchev

+0

Sì, e sembra che la tua risposta sia stata modificata per riflettere questo. Avevo solo commentato perché il primo post faceva apparire che potevi modificare in modo programmatico Scheme da http "a" https ". – Rich

0

Se si desidera accettare solo connessioni protette, creare un servizio separato per la porta 80 che solo reindirizza a HTTPS. Idealmente, si manterrebbe il percorso richiesto nel reindirizzamento HTTP.

Se si desidera semplicemente di incoraggiare le connessioni HTTPS per la navigazione (e non si cura di robot, per esempio), aggiungere questo alle tue pagine:

<script type="text/javascript"> 
if(location.protocol=='http:') 
    location=location.toString().replace(/^http:/,'https:'); 
</script> 
1

ho fatto questo con un HttpModule modo che si non devi preoccuparti di inserire il codice in ogni pagina principale (se ne hai più di una). Questa versione disattiva anche il reindirizzamento per localhost in modo da non dover avere SSL sul proprio computer. Fondamentalmente si fare un nuovo modulo HTTP in questo modo:

Public Class RedirectToHttpsModule 
    Implements IHttpModule 

    Public Sub Dispose() Implements IHttpModule.Dispose 

    End Sub 

    Public Sub Init(ByVal context As HttpApplication) Implements IHttpModule.Init 
     AddHandler context.BeginRequest, AddressOf context_BeginRequest 
    End Sub 

    Private Sub context_BeginRequest(ByVal sender As Object, ByVal e As EventArgs) 
     Dim application As HttpApplication = TryCast(sender, HttpApplication) 
     If Not application.Request.IsSecureConnection And Not application.Request.IsLocal Then 
      application.Response.Redirect(application.Request.Url.ToString().Replace(application.Request.Url.Scheme, "https")) 
     End If 
    End Sub 

End Class 

È inoltre necessario aggiungere la riga appropriata nel web.config per il HTTPModule:

<httpModules> 
     <add type="RedirectToHttpsModule" name="RedirectToHttpsModule" /> 
</httpModules> 
2

Di seguito si basa su Josh Stodolas risposta (IsSecureConnection) ma utilizza lo UriBuilder per modificare lo schema in https anziché sostituire una stringa. Il vantaggio di questo approccio è che non cambierà tutte le occorrenze di "http" nell'URL su "https".

if (!Request.IsSecureConnection) 
{ 
    UriBuilder newUri = new UriBuilder(Request.Url); 
    newUri.Scheme = Uri.UriSchemeHttps; 
    Response.Redirect(newUri.Uri.AbsoluteUri); 
} 
Problemi correlati