Wie wurde das SameSite-Attribut automatisch zu meinem Asp.net_SessionID-Cookie hinzugefügt?

20

Kürzlich wurde samesite = lax automatisch zu meinem Sitzungscookie hinzugefügt! Dieses Attribut wird einfach zur Sitzungs-ID hinzugefügt: "Set-Cookie ASP.NET_SessionId=zana3mklplqwewhwvika2125; path=/; HttpOnly; **SameSite=Lax**"

Meine auf IIS 8.5, Windows 2012 R2 gehostete Website enthält weder WAF noch UrlRewrite, und ich deaktiviere AntiVirus (Kasper).

aber noch haben das gleiche Problem auf einigen Kundenservern.

irgendeine Idee?

BEARBEITET: Ich finde dies: https://support.microsoft.com/en-us/help/4524419/kb4524419

ASP.NET gibt jetzt einen SameSite-Cookie-Header aus, wenn der HttpCookie.SameSite-Wert "None" ist, um anstehenden Änderungen an der Behandlung von SameSite-Cookies in Chrome Rechnung zu tragen. Im Rahmen dieser Änderung werden FormsAuth- und SessionState-Cookies auch mit SameSite = 'Lax' anstelle der vorherigen Standardeinstellung 'None' ausgegeben, obwohl diese Werte in web.config überschrieben werden können.

Wie kann ich Samesite-Cookies für SessionState in web.config überschreiben? Ich füge diese Zeile hinzu, aber es funktioniert nicht auf SessionID-Cookie! <httpCookies sameSite="Unspecified" />

BEARBEITET: Ich finde dies: https://docs.microsoft.com/en-us/dotnet/api/system.web.configuration.sessionstatesection.cookiesamesite?view=netframework-4.8#System_Web_Configuration_SessionStateSection_CookieSameSite

Legen Sie die Samesite für den Stateserver anhand des Attributs "cookieSameSite" des SessionState-Tags fest.

Sadegh
quelle
Haben Sie es durch Hinzufügen von "<sessionstate CookieSameSite" gelöst?? Ich habe 4.8 installiert, aber wenn ich vom IIS-Manager auf den Sessionstate-Abschnitt zugreife, erhalte ich nur ein nicht erkanntes Attribut.
Jokies Ding
1
Ich erhalte die gleiche Nachricht in iis, aber es funktioniert und ändere den gleichen Wert in der Set-Cookie-Zeit. Ich füge cookieSameSite = "None" zu meiner web.config hinzu, um das vorherige Verhalten zu erhalten. Beachten Sie, dass cookieSameSite zwischen Groß- und Kleinschreibung unterscheidet.
Sadegh
Ich musste nur eine 4.5.2-Legacy-Site dafür patchen - SameSite wurde von den Konfigurationen nicht unterstützt, daher musste ich das Cookie auf Session_Start abfangen und es direkt neu schreiben, wobei "SameSite = None; Secure" hinzugefügt wurde.
ParanoidCoder
@ParanoidCoder Tank Sie für Ihren Vorschlag, ich benutze .net 4.6.1 und es funktioniert für mich. Aber ich habe eine Frage zu Ihrer Lösung: Sie verwenden URL Rewrite (Erweiterung von IIS) oder Sie schreiben es in Session_Start per Code neu. Können Sie mir Ihren Code zeigen?
Sadegh

Antworten:

19

Fügen Sie diese Optionen zu web.config für sameSite = None, Lax oder Strict hinzu

<system.web>
    <httpCookies sameSite="None"/>
    <sessionState cookieSameSite="None" />
    <authentication mode="Forms">
        <forms cookieSameSite="None" />
    </authentication>
HJ van der Wijk
quelle
1
<httpCookies sameSitewird in .Net Framework 4.8
IronSean
Funktioniert es für 4.6.1 Framework?
Ankush Jain
@AnkushJain, nein, es wird seit .Net Framework 4.7.2 unterstützt.
Vasiliy Zverev
11

Ich kann rewrite nicht verwenden, da UrlRewrite nicht auf allen Servern meiner Kunden installiert ist.

Schließlich füge ich cookieSameSite zu meiner web.config hinzu:

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

Sadegh
quelle
2
es funktioniert nur nach .net 4.7.2
mrlayeghi
1
Ich benutze es in .net 4.6.1 und es funktioniert gut.
Sadegh
Es tut mir leid @ Sadegh.K, aber es wird nicht vor 4.7.2 funktionieren, wie hier angegeben: docs.microsoft.com/en-us/aspnet/samesite/…
cederlof
@cederlof Ich fand dies: support.microsoft.com/en-us/help/4533011/kb4533011
Sadegh
@Sadegh Richtig, aber das fügt cookieSameSiteweb.config nicht die Funktionalität hinzu - .NET 4.7.2 tut dies. Der Link, den ich in meinem Kommentar gepostet habe, ist auch auf der Seite verlinkt, auf die Sie verweisen.
Cederlof
8

Das CookieSameSite-Attribut ist für viele ältere Frameworks nicht verfügbar. Wenn Sie sich in einer Situation befinden, in der die akzeptierte Antwort in Ihrer Umgebung nicht unterstützt wird, lesen Sie weiter!

Ich habe mehrere SO-Antworten geändert, um diese URL-Umschreibung zu erhalten, die SameSite=NoneSitzungscookies hinzufügt , und sie für die meisten inkompatiblen Browser SameSite=Noneaus allen Cookies zu entfernen . Ziel dieser Neufassung ist es, das "Legacy" -Verhalten vor Chrome 80 beizubehalten.

Vollständiger Artikel in meinem Coder Frontline-Blog :

<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>

Dies sollte für die meisten ASP .Net- und ASP .Net Core-Anwendungen funktionieren, obwohl neuere Frameworks über geeignete Code- und Konfigurationsoptionen verfügen, mit denen Sie dieses Verhalten steuern können. Ich würde empfehlen, alle verfügbaren Optionen zu prüfen, bevor Sie mein oben beschriebenes Umschreiben verwenden.

zemien
quelle
Wo setzen Sie dies in MVC 5? In <system.net></system.net>?
Joel Wiklund
In<system.webServer>
zemien
Hinweis: Wenn das ASP.NET_SessionId-Cookie bereits vorhanden ist, SameSite=Laxwird es nur angehängt SameSite=Noneund nicht ersetzt.
Cederlof
@zemien Ich verstehe nicht, warum das (SameSite=.*)?überhaupt im Muster ist?
Cederlof
1
@cederlof du hast recht! Ich habe meinen regulären Ausdruck nicht richtig getestet, da meine Umgebung älter war. .Net-Framework, das die Lax-Eigenschaft nicht automatisch hinzugefügt hat. In Ihrem Fall können Sie einen anderen regulären Ausdruck verwenden , um den SameSite=LaxHeader auszuschließen : ((.*)(ASP.NET_SessionId)(=.*))(?=SameSite)Siehe aktualisierter regulärer Ausdruck101.com/r/7D9UdO/3. Beachten Sie jedoch, dass dieser reguläre Ausdruck alles ausschließt, was Sie später wünschen, z. B. den sicheren Header. Dies sollte eine seltene Bedingung sein, daher ist es wichtig zu sehen, was Ihr OS + Framework + App ausgibt, und die Regex entsprechend zu schreiben. Ich werde meine Antwort aktualisieren, um beide Richtungen zu reflektieren :)
zemien
7

Letztes Update: Zemiens Antwort ist umfassender und vollständiger als meine. weil es Cookies basierend auf dem Benutzeragenten setzt.

Meine Antwort:

Sie können SameSite = Lax durch SameSite = None für ASP.NET_SessionId in web.config folgendermaßen ersetzen:

<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>

Update: Um ein IOS-Problem zu vermeiden , ersetzen Sie es

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

mit

<action type="Rewrite" value="{R:1};" />
Mohammad Reza Sadreddini
quelle
2
Dies ist nur möglich, wenn das IIS-Umschreibemodul auf dem Server installiert ist
Vincent Ducroquet
1
Ihr Update für iOS-Problem verursacht auch Probleme in neueren Betriebssystemen. Grundsätzlich weisen einige Browser / Betriebssysteme SameSite = Lax zu, wenn der SameSite-Header fehlt. Ich glaube, der einzige Weg ist, UserAgent-Sniffing durchzuführen und zu entscheiden, ob der Header eingefügt werden soll oder nicht. Ich recherchiere noch, ob dies über web.config möglich ist oder ob eine Codeänderung in Session_Start enthalten sein muss.
Zemien
Um hervorzuheben, was @zemien schreibt, behebt Ihr iOS-Update ein Problem, führt jedoch ein anderes ein.
Cederlof
3

@zemien Ihre Lösung hat unsere Google Chrome-Probleme richtig gelöst

Wir haben eine Integration, bei der unsere Anwendung in einen Iframe eines Drittanbieters eingebettet ist. Die am 4. Februar 2020 veröffentlichte Chrome-Version 80 verhinderte das Laden von Cookies.

Ich musste jedoch das Muster ändern, um alle Cookies zu erfassen, das Secure-Flag hinzuzufügen und die Bedingung zu erfüllen, dass das Umschreiben auf localhost für unsere lokale Nicht-https-Umgebung nicht angewendet wird

<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>
C Rudolph
quelle
1

Funktioniert bei mir. In meine web.config-Datei aufgenommen:

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

Upgrade auf .Net Framework 4.8 + Installationspatch: 2019-12 Kumulatives Update für .NET Framework 3.5 und 4.8 für Windows 10 Version 1909 für x64 (KB4533002)

Stéphane
quelle