Come posso impostare il flag Secure su un cookie di sessione ASP.NET?


146

Come posso impostare il flag Secure su un cookie di sessione ASP.NET, in modo che venga trasmesso solo su HTTPS e mai su semplice HTTP?

Risposte:


127

Esistono due modi, un httpCookieselemento in web.configconsente di attivare requireSSLche trasmette solo tutti i cookie, inclusa la sessione solo in SSL e anche l'autenticazione all'interno dei moduli, ma se si attiva SSL su httpcookies è necessario attivarlo anche all'interno della configurazione dei moduli.

Modifica per chiarezza: inseriscilo<system.web>

<httpCookies requireSSL="true" />

13
+1 Per chiarire, questo è ciò che dovresti aggiungere a web.config per impostare il flag di sicurezza sul cookie auth su true<httpCookies requireSSL="true" />
Tr1stan

8
Nota che questo dipende dalla tua configurazione (a livello di server). Ho eliminato l'area di test con l'errore "L'applicazione è configurata per emettere cookie sicuri. Questi cookie richiedono al browser di inviare la richiesta su SSL (protocollo https). Tuttavia, la richiesta corrente non è su SSL." Questo perché abbiamo un proxy inverso in atto e i browser si connettono ad esso tramite SSL ma il proxy inverso al server IIS è sulla porta 80, quindi l'applicazione non pensava che fosse protetta.
mlhDev

4
@Bargitta Abbiamo gestito l'evento Application_PreSendRequestHeaders e se una determinata impostazione dell'applicazione è vera, impostiamo tutti i cookie in modo sicuro. Questa impostazione dell'app è configurata solo per i nostri siti esterni HTTPS.
mlhDev

Vedo, quindi tutto il tuo sito esterno utilizzerà HTTPS, grazie.
Bargitta,

Avevo visto altrove che dopo IIS7 system.web era stato sostituito da system.webserver, quindi ho provato a inserire questa impostazione lì. In IIS 8.5 ciò ha causato un errore di configurazione, ma ha funzionato tutto se ho aggiunto una sezione system.web al file di configurazione e inserito l'impostazione.
Eborbob,

181

Nell'elemento <system.web>, aggiungi il seguente elemento:

<httpCookies requireSSL="true" />

Tuttavia, se hai un <forms>elemento nel tuo system.web\authenticationblocco, questo sovrascriverà l'impostazione httpCookies, ripristinandola al valore predefinito false.

In tal caso, è necessario aggiungere l' requireSSL="true"attributo anche all'elemento form.

Quindi finirai con:

<system.web>
    <authentication mode="Forms">
        <forms requireSSL="true">
            <!-- forms content -->
        </forms>
    </authentication>
</system.web>

Vedi qui e qui per la documentazione MSDN di questi elementi.


2
Puoi evitare altre impostazioni web.config che sovrascrivono le tue impostazioni <httpCookies requireSSL = "true" /> includendo l'attributo 'lockItem'. In questo modo: <httpCookies requireSSL = "true" lockItem = "true" />. Maggiori informazioni qui dotnetnoob.com/2010/11/how-to-secure-aspnet-cookies.html
JTech

1
Inoltre, se esiste un roleManagerelemento, anche il suo attributo cookieRequireSSL="true"dovrebbe essere impostato su true. Ref. msdn.microsoft.com/en-us/library/…
Jeff Mergler

aggiungendo le modifiche precedenti nei file correlati, gli oggetti sessione non funzionano nella mia applicazione, stanno diventando nulli. come posso correggere questo problema allora?
sabato

Stai usando HTTP o HTTPS per la tua app? Il flag "sicuro" che stiamo impostando qui impedisce l'invio di cookie tramite connessioni non crittografate (ad es. HTTP)
Martin Eden

21

Le cose si complicano rapidamente se si parla di codice per il check-in in un ambiente aziendale. Abbiamo scoperto che l'approccio migliore è che web.Release.config contenga quanto segue:

<system.web>
  <compilation xdt:Transform="RemoveAttributes(debug)" />
  <authentication>
      <forms xdt:Transform="Replace" timeout="20" requireSSL="true" />
  </authentication>
</system.web>

In questo modo, gli sviluppatori non sono interessati (in esecuzione in debug) e solo i server che ottengono build di rilascio richiedono che i cookie siano SSL.


^^^ Questo ^^^ è il modo. Ulteriori informazioni su: Web.Config trasforma: go.microsoft.com/fwlink/?LinkId=125889
Jeff Mergler

0

sicuro: questo attributo indica al browser di inviare il cookie solo se la richiesta viene inviata su un canale sicuro come HTTPS. Ciò contribuirà a proteggere il cookie dal passaggio di richieste non crittografate. Se è possibile accedere all'applicazione sia su HTTP che su HTTPS, esiste la possibilità che il cookie possa essere inviato in chiaro.


0

Basandomi sulla risposta di @Mark D, utilizzerei web.config transforms per impostare tutti i vari cookie su Secure. Ciò include l'impostazione anonymousIdentification cookieRequireSSLe httpCookies requireSSL.

A tal fine imposteresti il ​​tuo web.Release.config come:

<?xml version="1.0"?>
<configuration xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform">
  <system.web>
    <httpCookies xdt:Transform="SetAttributes(httpOnlyCookies)" httpOnlyCookies="true" />
    <httpCookies xdt:Transform="SetAttributes(requireSSL)" requireSSL="true" />
    <anonymousIdentification xdt:Transform="SetAttributes(cookieRequireSSL)" cookieRequireSSL="true" /> 
  </system.web>
</configuration>

Se stai usando Autenticazione ruoli e moduli con ASP.NET Membership Provider(lo so, è antica) vorrai anche impostare sicuro anche roleManager cookieRequireSSLgli forms requireSSLattributi e. In tal caso, web.release.config potrebbe apparire così (incluso sopra più nuovi tag per l'API di appartenenza):

<?xml version="1.0"?>
<configuration xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform">
  <system.web>
    <httpCookies xdt:Transform="SetAttributes(httpOnlyCookies)" httpOnlyCookies="true" />
    <httpCookies xdt:Transform="SetAttributes(requireSSL)" requireSSL="true" />
    <anonymousIdentification xdt:Transform="SetAttributes(cookieRequireSSL)" cookieRequireSSL="true" /> 
    <roleManager xdt:Transform="SetAttributes(cookieRequireSSL)" cookieRequireSSL="true" />
    <authentication>
        <forms xdt:Transform="SetAttributes(requireSSL)" requireSSL="true" />
    </authentication>
  </system.web>
</configuration>

Lo sfondo su web.config si trasforma qui: http://go.microsoft.com/fwlink/?LinkId=125889

Ovviamente questo va oltre la domanda originale del PO, ma se non li imposti tutti in modo sicuro, puoi aspettarti che uno strumento di scansione di sicurezza noterà e vedrai apparire bandiere rosse sul rapporto. Chiedimi come lo so. :)

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.