2012-01-24 12 views
6

Ho trovato This Post e sembra che mi servisse per un'applicazione, la mia domanda è: come tornare a un semplice http quando https non è più necessario? Lo farà intrinsecamente in base a un'azione che non ha l'annotazione [RequireHttps]?MVC3 dopo [RequireHttps] come assicurarsi che non venga utilizzato https

MODIFICA: ho trovato un paio di post parlando di passare da https a http (herehere). Tuttavia, apprezzerei ancora una risposta alla domanda di seguito.

In alternativa, avevo discusso di avere l'applicazione aperta in una nuova finestra. È giusto presupporre che l'https si applicherà solo alla nuova finestra?

+0

una volta che l'utente ha navigato attraverso requirehttps, in caso di ritorno a un controller senza requirehttps saranno ancora sotto l'https. –

+0

perché tornare al semplice http? Esiste un enorme rischio per la sicurezza, in primo luogo i token di autenticazione di form vengono trasmessi in chiaro e gli ID di sessione possono essere facilmente annusati. Usa RequireSsl nell'autentica della tua form (se la stai usando) ma a tua volta nota ovunque che non -ssl fallirà. Esegui tutto il tuo sito ssl + capisci quanto è facile rubare una sessione da un unico pacchetto http registrato. –

+0

@AdamTuliper I attualmente non ha/ha bisogno di alcuna autenticazione. Sto usando questo per un'applicazione di lavoro. Una volta inviato, è inutile crittografare la navigazione più a lungo. Non memorizzo nulla nella sessione. Il nostro server web si sta alzando lì in età quindi tutto ciò che posso fare per facilitare il carico è necessario quindi se non ho più bisogno di ssl allora perché preoccuparsi? Dubito che la crittografia sta andando a impantanare la macchina, ma vorrei solo presumere di non usarlo dove non è necessario poiché la crittografia delle risorse non è gratuita. – Jared

risposta

7

RequireHttps di ASP.NET MVC va solo in un modo. In passato ho appena creato il mio propria implementazione FilterAttribute per permettere di viaggio in entrambe le direzioni:

EnsureHttpsAttribute

public class EnsureHttpsAttribute : FilterAttribute, IAuthorizationFilter 
    { 
    public void OnAuthorization(AuthorizationContext filterContext) 
    { 
     Verify.NotNull(filterContext, "filterContext"); 
     Verify.True(filterContext.HttpContext.Request.HttpMethod.Equals("GET", StringComparison.OrdinalIgnoreCase), "filterContext"); 

     var request = filterContext.HttpContext.Request; 
     if (request.Url != null && !request.IsSecureConnection && !request.IsLocal) 
     filterContext.Result = new RedirectResult("https://" + request.Url.Host + request.RawUrl); 
    } 
    } 

EnsureHttpAttribute

public class EnsureHttpAttribute : FilterAttribute, IAuthorizationFilter 
    { 
    public void OnAuthorization(AuthorizationContext filterContext) 
    { 
     Verify.NotNull(filterContext, "filterContext"); 
     Verify.True(filterContext.HttpContext.Request.HttpMethod.Equals("GET", StringComparison.OrdinalIgnoreCase), "filterContext"); 

     var request = filterContext.HttpContext.Request; 
     if (request.Url != null && request.IsSecureConnection) 
     filterContext.Result = new RedirectResult("http://" + request.Url.Host + request.RawUrl); 
    } 
    } 

Quasi la stessa implementazione come RequireHttpsAttribute se la memoria non serve ; sebbene la suddetta implementazione controlli se è una richiesta Local e ignora il passaggio a HTTPS.

+0

qualche pensiero sulla seconda parte della mia domanda? Se apro l'azione in una nuova finestra sono corretto nel presupposto che https verrà applicato solo alla nuova finestra? – Jared

+0

Assumendo URL relativi nella finestra popup, tutto nella nuova finestra rimarrà HTTPS a meno che non si abbia un URL assoluto per tornare esplicitamente su HTTP. La finestra principale rimarrà in http a meno che tu non navighi o reindirizzi esplicitamente a HTTPS. –

+0

Probabilmente non è una buona idea reindirizzare le richieste POST in quanto ciò potrebbe confondere il browser. cf implementazione ufficiale dell'attributo. – nakhli

2
+0

Articolo interessante e buona informazione. Tuttavia, al momento non sto effettuando alcuna autenticazione sul mio sito.Una volta che questo accade, ho visto che questo è molto utile, quindi grazie per il link. – Jared

+0

Credo che dalle altre risposte e post su SO, la maggior parte delle persone finisca per scrivere il proprio attributo personalizzato per gestire situazioni uniche. –

+0

Finora è quello che sembra. Penso che ciò che farò più probabilmente sia reindirizzare automaticamente a un URL assoluto non https una volta terminato il modulo o aprire una nuova finestra in https e lasciare da solo la precedente finestra del browser. – Jared

Problemi correlati