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.


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>

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


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


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


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};" />

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>

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)

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.