jak atrybut SameSite został automatycznie dodany do mojego pliku cookie Asp.net_SessionID?

20

Ostatnio samesite = luźne automatyczne dodawanie do mojego pliku cookie sesji! ten atrybut wystarczy dodać do sessionID: "Set-Cookie ASP.NET_SessionId=zana3mklplqwewhwvika2125; path=/; HttpOnly; **SameSite=Lax**"

Moja witryna jest hostowana w IIS 8.5, Windows 2012 R2 i nie ma WAF ani UrlRewrite, a ja wyłączam program antywirusowy (kasper).

ale mimo to mają ten sam problem na niektórych serwerach klientów.

dowolny pomysł?

ZMIENIONO: Znajduję to: https://support.microsoft.com/en-us/help/4524419/kb4524419

ASP.NET będzie teraz emitować nagłówek pliku cookie SameSite, gdy wartość HttpCookie.SameSite ma wartość „Brak”, aby uwzględnić nadchodzące zmiany w obsłudze plików cookie SameSite w Chrome. W ramach tej zmiany pliki cookie FormsAuth i SessionState będą również wydawane z SameSite = „Lax” zamiast poprzedniej wartości domyślnej „None”, chociaż te wartości można zastąpić w pliku web.config.

Jak mogę zastąpić pliki cookie Samesite dla SessionState w pliku web.config? dodałem ten wiersz, ale nie działa na SessionID cookie! <httpCookies sameSite="Unspecified" />

ZMIENIONO: Znajduję to: https://docs.microsoft.com/en-us/dotnet/api/system.web.configuration.sessionstatesection.cookiesamesite?view=netframework-4.8#System_Web_Configuration_SessionStateSection_CookieSameSite

Ustaw samesite dla stateserver za pomocą atrybutu „cookieSameSite” znacznika SessionState.

Sadegh
źródło
Czy rozwiązałeś ten problem, dodając „<sessionstate CookieSameSite”? Mam zainstalowaną wersję 4.8, ale kiedy uzyskuję dostęp do sekcji stanu sesji od menedżera IIS. Po prostu otrzymuję nierozpoznany atrybut.
Jokies Ding
1
otrzymuję tę samą wiadomość w iis, ale działa i zmienia wartość samesite w ustawionym czasie cookie. dodaję cookieSameSite = "None" do mojego pliku web.config, aby uzyskać wcześniejsze zachowanie. zauważ, że cookieSameSite rozróżnia wielkość liter.
Sadegh,
Po prostu musiałem załatać starszą stronę 4.5.2 - SameSite nie było obsługiwane przez konfiguracje, więc musiałem przechwycić plik cookie na Session_Start i przepisać go bezpośrednio z dodanym „SameSite = None; Secure”.
ParanoidCoder
@ParanoidCoder tank Ci za sugestię, używam .net 4.6.1 i działa dla mnie. Ale mam pytanie dotyczące twojego rozwiązania: używasz przepisywania adresów URL (rozszerzenie IIS) lub przepisujesz je kodem w Session_Start, czy możesz mi pokazać swój kod?
Sadegh

Odpowiedzi:

19

Dodaj te opcje do web.config dla sameSite = None, Lax lub Strict

<system.web>
    <httpCookies sameSite="None"/>
    <sessionState cookieSameSite="None" />
    <authentication mode="Forms">
        <forms cookieSameSite="None" />
    </authentication>
HJ van der Wijk
źródło
1
<httpCookies sameSitenie jest pokazany jako poprawna opcja w .Net Framework 4.8
IronSean
Czy to działa w ramach 4.6.1?
Ankush Jain
@AnkushJain, nie, jest obsługiwany od .Net Framework 4.7.2.
Wasilij Zverev
11

Nie mogę użyć przepisywania, ponieważ UrlRewrite nie jest zainstalowany na wszystkich serwerach moich klientów.

Na koniec dodaję cookieSameSite do mojego pliku web.config:

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

Sadegh
źródło
2
działa tylko po .net 4.7.2
mrlayeghi
1
używam go w .net 4.6.1 i działa dobrze.
Sadegh
Przepraszam @ Sadegh.K, ale nie będzie działać przed 4.7.2, jak stwierdzono tutaj: docs.microsoft.com/en-us/aspnet/samesite/…
cederlof
@cederlof znalazłem to: support.microsoft.com/en-us/help/4533011/kb4533011
Sadegh
@Sadegh Racja, ale to nie dodaje cookieSameSitefunkcjonalności do web.config - robi to .NET 4.7.2. Link, który zamieściłem w moim komentarzu, jest również link do strony, do której się odwołujesz.
cederlof
8

Atrybut CookieSameSite nie jest dostępny dla wielu starszych platform. Jeśli jesteś w sytuacji, gdy zaakceptowana odpowiedź nie jest obsługiwana w twoim środowisku, czytaj dalej!

Zmodyfikowałem kilka odpowiedzi SO, aby wymyślić przepisywanie adresów URL, które dodaje SameSite=Nonesesyjne pliki cookie, a także usuwam SameSite=Noneze wszystkich plików cookie w większości niezgodnych przeglądarek. Celem tego przepisania jest zachowanie „starszego” zachowania sprzed Chrome 80.

Pełny opis na moim blogu 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>

Powinno to działać w przypadku większości aplikacji ASP .Net i ASP .Net Core, chociaż nowsze platformy mają odpowiedni kod i opcje konfiguracji umożliwiające kontrolowanie tego zachowania. Przed użyciem mojego przepisywania powyżej poleciłbym zbadanie wszystkich dostępnych opcji.

zemien
źródło
Gdzie umieścisz to w MVC 5? W <system.net></system.net>?
Joel Wiklund
W<system.webServer>
zemien
Uwaga: jeśli plik cookie ASP.NET_SessionId już go zawiera, SameSite=Laxzostanie tylko dołączony, SameSite=Nonea nie zastąpi go.
cederlof
@zemien Nie rozumiem, dlaczego (SameSite=.*)?w ogóle mają wzorzec?
cederlof
1
@cederlof masz rację! Nie przetestowałem poprawnie wyrażenia regularnego, ponieważ moje środowisko było starsze .NET Framework, który nie dodał automatycznie właściwości Lax. W twoim przypadku możesz użyć innego wyrażenia regularnego, aby wykluczyć SameSite=Laxnagłówek: ((.*)(ASP.NET_SessionId)(=.*))(?=SameSite)Zobacz zaktualizowany regex101.com/r/7D9UdO/3 - jednak pamiętaj, że to wyrażenie wyklucza później wszystko, co chcesz później, na przykład bezpieczny nagłówek. Powinno to być rzadkim warunkiem, dlatego kluczowym punktem jest sprawdzenie, co emituje aplikacja systemu + OS i napisanie wyrażenia regularnego stosownie do potrzeb. Zaktualizuję moją odpowiedź, aby odzwierciedlała obie strony :)
zemien
7

Ostatnia aktualizacja: odpowiedź zemien jest bardziej wyczerpująca i kompletna niż moja. ponieważ ustawia cookie na podstawie agenta użytkownika.

Moja odpowiedź:

Możesz zamienić SameSite = Lax na SameSite = None dla ASP.NET_SessionId w web.config w następujący sposób:

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

Aktualizacja: aby zapobiec problemowi z IOS , wymień

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

z

<action type="Rewrite" value="{R:1};" />
Mohammad Reza Sadreddini
źródło
2
Jest to możliwe tylko wtedy, gdy na serwerze jest zainstalowany moduł przepisywania IIS
Vincent Ducroquet
1
Twoja aktualizacja dla systemu iOS spowoduje również problemy w nowszych systemach operacyjnych. Zasadniczo, niektóre przeglądarki / systemy operacyjne przypisują SameSite = Lax, jeśli brakuje nagłówka SameSite. Uważam, że jedynym sposobem jest wykonanie wąchania UserAgent i zdecydowanie, czy dołączyć nagłówek, czy nie. Nadal szukam, czy można to zrobić za pośrednictwem web.config, czy musi zawierać zmianę kodu w Session_Start.
zemien
Aby podkreślić to, co pisze @zemien, aktualizacja iOS rozwiązuje jeden problem, ale wprowadza inny.
cederlof
3

@zemien Twoje rozwiązanie poprawnie rozwiązało nasze problemy z Google Chrome

Mamy integrację, w której nasza aplikacja jest osadzona w ramce iframe na stronie trzeciej. Wersja Chrome 80 wydana 4 lutego 2020 roku uniemożliwiła ładowanie plików cookie.

Musiałem jednak zmodyfikować wzorzec, aby przechwycić wszystkie pliki cookie, dodać flagę Bezpieczne i warunek, aby nie stosować przepisywania na localhost dla naszego lokalnego środowiska innego niż https

<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
źródło
1

Pracuje dla mnie. Dodano do mojego pliku web.config:

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

Uaktualnij do .NET Framework 4.8 + poprawka instalacyjna: Zbiorcza aktualizacja 2019-12 dla .NET Framework 3.5 i 4.8 dla Windows 10 wersja 1909 dla x64 (KB4533002)

Stéphane
źródło