2012-03-15 11 views
7

Ho un sito Web ASP MVC 3 che ha un modulo di feedback e dovrebbe richiedere SSL.Attributo ASP MVC 3 RequireHttps modifica tutti i collegamenti a https

Ora ho un'azione chiamata Feedback all'interno di un controller chiamato "ContactUs" responsabile della visualizzazione e dell'elaborazione del feedback.

Quando ho utilizzato l'attributo [RequireHttps] per quell'azione, funziona correttamente e cambia l'URL in "https". Tuttavia, ho notato che tutti i collegamenti all'interno della mia pagina ora puntano a "https"! Come se questo attributo avesse forzato il motore di routing ad applicare lo stesso a tutti i link !!!

Ovviamente, l'SSL è richiesto solo per questa singola azione e per tutto il resto è necessario disporre di un normale http.

Qualcuno potrebbe dirmi come risolvere questo?

+0

Perché le altre pagine "richiedono" solo http? È davvero importante se sono https o meno, a patto che le pagine che richiedono https siano criptate? –

+0

@Mystere Man: https riduce notevolmente le prestazioni del server web. Su certe configurazioni potrebbe essere un grosso problema. –

+1

@zespri - Nei giorni passati, https era un carico significativo. Oggi ti garantisco che i server fanno più fatica a costruire le pagine che a crittografarle. Stai dicendo che preferiresti rendere il tuo sito insicuro piuttosto che affrontare un leggero aumento del carico. Il punto in questione è che hai già creato il carico richiedendo il login https, e le richieste future non avranno bisogno di molte elaborazioni extra. –

risposta

13

Nel tuo caso [RequireHttp] attributo potrebbe essere OK se si cancella il cookie di login - o sarai inviarlo in chiaro-testo attraverso il filo. Potrebbe essere più lavoro di quanto valga la pena di evitare il leggero costo di ulteriori chiamate HTTPS. SO è tutto incentrato sul riciclo delle domande e gli altri utenti che leggono la tua domanda potrebbero pensare che sia corretto passare a HTTP dopo l'accesso, quando di solito è la cosa sbagliata da fare.

L'attributo [RequireHttps] può essere utilizzato su un tipo di controller o un metodo di azione per dire "a questo si può accedere solo tramite SSL". Le richieste non SSL al controller o all'azione verranno reindirizzate alla versione SSL (se HTTP GET) o rifiutate (se un POST HTTP). È possibile sovrascrivere RequireHttpsAttribute e modificare questo comportamento, se lo si desidera. Non esiste un attributo integrato [RequireHttp] che faccia il contrario, ma potresti facilmente crearne uno se lo desideri.

Ci sono anche sovraccarichi di Html.ActionLink() che accettano un parametro di protocollo; puoi specificare esplicitamente "http" o "https" come protocollo. Ecco lo MSDN documentation su uno di questi sovraccarichi. Se non si specifica un protocollo o se si chiama un overload che non ha un parametro di protocollo, si presume che si desidera che il collegamento abbia lo stesso protocollo della richiesta corrente.

La ragione per cui non abbiamo un attributo [RequireHttp] in MVC è che non ci sia davvero molto vantaggio. Non è così interessante come [RequireHttps] e incoraggia gli utenti a fare la cosa sbagliata. Ad esempio, molti siti Web effettuano l'accesso tramite SSL e reindirizzano su HTTP dopo aver effettuato l'accesso, che è assolutamente la cosa sbagliata da fare. Il tuo login cookie è tanto segreto quanto il tuo nome utente + password, e ora lo stai inviando in chiaro attraverso il cavo. Inoltre, hai già avuto il tempo di eseguire l'handshake e proteggere il canale (che è la maggior parte di ciò che rende HTTPS più lento di HTTP) prima che venga eseguita la pipeline MVC, quindi [RequireHttp] non renderà la richiesta corrente o le richieste future molto Più veloce.

+0

Grazie per la risposta. Penso che dovrei usare LinkExtensions.ActionLink, ma non so come usarlo correttamente. puoi spiegarmelo? – Yousi

+0

potrebbe essere una domanda di base, come letto [qui] (http://security.stackexchange.com/questions/12531/ssl-with-get-and-post) e [qui] (http://stackoverflow.com/ domande/499591/are-https-urls-encrypted) anche la richiesta 'post' viene crittografata, ma piacerebbe sapere che dovrei decorare anche' RequireHttps' in post? – stom

0

È possibile creare un altro attributo filtro personalizzato per tornare a http. Prova la soluzione da questa domanda ... Why once SSL is enabled with [RequireHttps] at action level, it remains enabled forever?

+1

Il tuo login cookie è tanto segreto quanto il tuo nome utente + password, e ora lo stai inviando in chiaro attraverso il filo. Inoltre, hai già avuto il tempo di eseguire l'handshake e proteggere il canale (che è la maggior parte di ciò che rende HTTPS più lento di HTTP) prima che la pipeline MVC venga eseguita, quindi [RequireHttp] non renderà la richiesta corrente o futura richieste molto più veloci. – RickAndMSFT

Problemi correlati