in che modo l'attributo SameSite è stato aggiunto automaticamente al mio cookie Asp.net_SessionID?


20

Recentemente samesite = lax si aggiunge automaticamente al mio cookie di sessione! questo attributo basta aggiungere a sessionID: "Set-Cookie ASP.NET_SessionId=zana3mklplqwewhwvika2125; path=/; HttpOnly; **SameSite=Lax**"

Il mio sito Web è ospitato su IIS 8.5, Windows 2012 R2 e non ho WAF o UrlRewrite e spengo AntiVirus (kasper).

ma hanno ancora lo stesso problema su alcuni server dei clienti.

qualche idea?

EDITED: lo trovo: https://support.microsoft.com/en-us/help/4524419/kb4524419

ASP.NET emetterà ora un'intestazione di cookie SameSite quando il valore di HttpCookie.SameSite è "Nessuno" per accogliere le modifiche imminenti alla gestione dei cookie di SameSite in Chrome. Come parte di questa modifica, anche i cookie FormsAuth e SessionState verranno emessi con SameSite = 'Lax' invece della precedente impostazione predefinita di 'None', sebbene questi valori possano essere sovrascritti in web.config.

Come posso sovrascrivere i cookie samesite per SessionState in web.config? aggiungo questa riga, ma non funziona con il cookie SessionID! <httpCookies sameSite="Unspecified" />

EDITED: lo trovo: https://docs.microsoft.com/en-us/dotnet/api/system.web.configuration.sessionstatesection.cookiesamesite?view=netframework-4.8#System_Web_Configuration_SessionStateSection_CookieSameSite

Imposta samesite per gli stati server tramite l'attributo "cookieSameSite" del tag SessionState.


L'hai risolto aggiungendo "<sessionSate CookieSameSite"? Ho 4.8 installato ma quando accedo alla sezione sessionstate dal gestore IIS. Ricevo solo un attributo non riconosciuto.
Jokies Ding

1
ricevo lo stesso messaggio in IIS, ma funziona e cambia il valore dello stesso sito nel tempo impostato sui cookie. aggiungo cookieSameSite = "Nessuno" al mio web.config per ottenere il comportamento precedente. notare che cookieSameSite è caseSesitive.
Sadegh,

Ho dovuto solo patchare un sito legacy 4.5.2 per questo - SameSite non era supportato dalle configurazioni, quindi ho dovuto intercettare il cookie su Session_Start e riscriverlo direttamente con l'aggiunta di "SameSite = None; Secure".
ParanoidCoder

@ParanoidCoder grazie per il tuo suggerimento, io uso .net 4.6.1 e funziona per me. Ma ho una domanda sulla tua soluzione: usi la riscrittura URL (estensione di IIS) o la riscrivi tramite codice in Session_Start, puoi mostrarmi il tuo codice?
Sadegh

Risposte:


19

Aggiungi queste opzioni a web.config per sameSite = None, Lax o Strict

<system.web>
    <httpCookies sameSite="None"/>
    <sessionState cookieSameSite="None" />
    <authentication mode="Forms">
        <forms cookieSameSite="None" />
    </authentication>

1
<httpCookies sameSitenon è mostrato come opzione valida su .Net Framework 4.8
IronSean

Funziona con il framework 4.6.1?
Ankush Jain,

@AnkushJain, no, è supportato da .Net Framework 4.7.2.
Vasiliy Zverev,

11

Non riesco a usare la riscrittura, perché UrlRewrite non è installato su tutti i server dei miei clienti.

Infine aggiungo cookieSameSite al mio web.config:

<sessionState mode="StateServer" cookieSameSite="None" sqlConnectionString="data source=(local);user id=sa;password=" cookieless="false" timeout="20" />


2
funziona solo dopo .net 4.7.2
mrlayeghi il

1
lo uso in .net 4.6.1 e funziona benissimo.
Sadegh,

Mi dispiace @ Sadegh.K, ma non funzionerà prima della 4.7.2, come indicato qui: docs.microsoft.com/en-us/aspnet/samesite/…
cederlof


@Sadegh Giusto, ma ciò non aggiunge la cookieSameSitefunzionalità a web.config - .NET 4.7.2 lo fa. Il link che ho pubblicato nel mio commento è anche collegato alla pagina a cui ti riferisci.
cederlof,

8

L'attributo CookieSameSite non è disponibile per molti framework precedenti. Se ti trovi nella situazione in cui la risposta accettata non è supportata nel tuo ambiente, continua a leggere!

Ho modificato diverse risposte SO per creare questa riscrittura URL che si aggiunge SameSite=Noneai cookie di sessione e rimuove anche SameSite=Noneda tutti i cookie per la maggior parte dei browser incompatibili. Lo scopo di questa riscrittura è preservare il comportamento "legacy" pre-Chrome 80.

Scrittura completa nel mio blog Coder Frontline :

<rewrite>
  <outboundRules>
    <preConditions>
      <!-- Checks User Agent to identify browsers incompatible with SameSite=None -->
      <preCondition name="IncompatibleWithSameSiteNone" logicalGrouping="MatchAny">
        <add input="{HTTP_USER_AGENT}" pattern="(CPU iPhone OS 12)|(iPad; CPU OS 12)" />
        <add input="{HTTP_USER_AGENT}" pattern="(Chrome/5)|(Chrome/6)" />
        <add input="{HTTP_USER_AGENT}" pattern="( OS X 10_14).*(Version/).*((Safari)|(KHTML, like Gecko)$)" />
      </preCondition>
    </preConditions>

    <!-- Adds or changes SameSite to None for the session cookie -->
    <!-- Note that secure header is also required by Chrome and should not be added here -->
    <rule name="SessionCookieAddNoneHeader">
      <match serverVariable="RESPONSE_Set-Cookie" pattern="(.*ASP.NET_SessionId.*)" />
      <!-- Use this regex if your OS/framework/app adds SameSite=Lax automatically to the end of the cookie -->
      <!-- <match serverVariable="RESPONSE_Set-Cookie" pattern="((.*)(ASP.NET_SessionId)(=.*))(?=SameSite)" /> -->
      <action type="Rewrite" value="{R:1}; SameSite=None" />
    </rule>

    <!-- Removes SameSite=None header from all cookies, for most incompatible browsers -->
    <rule name="CookieRemoveSameSiteNone" preCondition="IncompatibleWithSameSiteNone">
      <match serverVariable="RESPONSE_Set-Cookie" pattern="(.*)(SameSite=None)" />
      <action type="Rewrite" value="{R:1}" />
    </rule>
  </outboundRules>
</rewrite>

Questo dovrebbe funzionare per la maggior parte delle applicazioni ASP .Net e ASP .Net Core, sebbene i Frameworks più recenti abbiano codice e opzioni di configurazione adeguati per consentire il controllo di questo comportamento. Consiglierei di ricercare tutte le opzioni disponibili prima di usare la mia riscrittura sopra.


Dove lo metti in MVC 5? In <system.net></system.net>?
Joel Wiklund il

In<system.webServer>
zemien,

Nota: se il cookie ASP.NET_SessionId ha già SameSite=Laxquesto, verrà aggiunto SameSite=Nonee non sostituito.
cederlof,

@zemien Non capisco perché il motivo è (SameSite=.*)?tutto nello schema?
cederlof,

1
@cederlof hai ragione! Non ho testato correttamente il mio regex perché il mio ambiente era un framework .Net più vecchio che non aggiungeva automaticamente la proprietà Lax. Nel tuo caso, puoi usare una regex diversa per escludere l' SameSite=Laxintestazione: ((.*)(ASP.NET_SessionId)(=.*))(?=SameSite)vedi regex101.com/r/7D9UdO/3 aggiornato , tuttavia tieni presente che questa regex escluderà qualsiasi cosa tu possa desiderare in seguito, come l'intestazione sicura. Questa dovrebbe essere una condizione rara, quindi il punto chiave è vedere cosa sta emettendo la tua app OS + framework + e scrivere il regex adatto. Aggiornerò la mia risposta per riflettere in entrambi i modi :)
zemien

7

Ultimo aggiornamento: la risposta di zemien è più completa e completa della mia. perché imposta i cookie in base al programma utente.

La mia risposta:

È possibile sostituire SameSite = Lax con SameSite = None per ASP.NET_SessionId in web.config nel modo seguente:

<rewrite>
  <outboundRules>
    <rule name="AddSameSiteCookieFlag">
      <match serverVariable="RESPONSE_Set-Cookie" pattern="((.*)(ASP.NET_SessionId)(=.*))(SameSite=Lax)" />
      <action type="Rewrite" value="{R:1};SameSite=None" />
    </rule>
  </outboundRules>
</rewrite>

Aggiornamento: per prevenire il problema IOS , sostituire

<action type="Rewrite" value="{R:1};SameSite=None" />

con

<action type="Rewrite" value="{R:1};" />

2
Ciò è possibile solo se sul server è installato il modulo di riscrittura IIS
Vincent Ducroquet,

1
Il tuo aggiornamento per il problema iOS causerà anche problemi nei nuovi sistemi operativi. In sostanza, alcuni browser / SO assegneranno SameSite = Lax se manca l'intestazione SameSite. Credo che l'unico modo sia quello di annusare UserAgent e decidere se includere o meno l'intestazione. Sto ancora cercando se questo può essere fatto tramite web.config o deve includere una modifica del codice in Session_Start.
zemien

Solo per evidenziare ciò che scrive @zemien, l'aggiornamento iOS risolve un problema ma ne introduce un altro.
cederlof,

3

@zemien la tua soluzione ha risolto correttamente i nostri problemi con Google Chrome

Abbiamo un'integrazione in cui la nostra applicazione è integrata in un iframe su una terza parte. La versione 80 di Chrome rilasciata il 4 febbraio 2020 ha impedito il caricamento dei cookie.

Tuttavia, ho dovuto modificare il modello per acquisire tutti i cookie, aggiungere il flag Secure e la condizione per non applicare la riscrittura su localhost per il nostro ambiente non https locale

<rule name="SessionCookieAddNoneHeader">
      <match serverVariable="RESPONSE_Set-Cookie" pattern="(.*)(SameSite=.*)?" />
      <conditions logicalGrouping="MatchAll" trackAllCaptures="false">
        <add input="{HTTP_HOST}" pattern="localhost" negate="true" />
      </conditions>
      <action type="Rewrite" value="{R:1}; SameSite=None; Secure" />
</rule>

1

Per me va bene. Aggiunto nel mio file web.config:

<sessionState cookieSameSite="None"></sessionState>

Aggiornamento a .Net Framework 4.8 + patch di installazione: aggiornamento cumulativo 2019-12 per .NET Framework 3.5 e 4.8 per Windows 10 versione 1909 per x64 (KB4533002)

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.