comment l'attribut SameSite a été ajouté automatiquement à mon cookie Asp.net_SessionID?

20

Récemment, samesite = lax s'est ajouté automatiquement à mon cookie de session! cet attribut vient s'ajouter à sessionID: "Set-Cookie ASP.NET_SessionId=zana3mklplqwewhwvika2125; path=/; HttpOnly; **SameSite=Lax**"

Mon site Web est hébergé sur IIS 8.5, Windows 2012 R2, et n'a pas WAF ou UrlRewrite et je désactive AntiVirus (kasper).

mais ont pourtant le même problème sur certains serveurs clients.

une idée?

EDITÉ: Je trouve ceci: https://support.microsoft.com/en-us/help/4524419/kb4524419

ASP.NET émettra désormais un en-tête de cookie SameSite lorsque la valeur HttpCookie.SameSite est «Aucune» pour s'adapter aux modifications à venir de la gestion des cookies SameSite dans Chrome. Dans le cadre de cette modification, les cookies FormsAuth et SessionState seront également émis avec SameSite = 'Lax' au lieu de la valeur par défaut précédente de 'None', bien que ces valeurs puissent être remplacées dans web.config.

Comment puis-je remplacer les cookies du même site pour SessionState dans web.config? j'ajoute cette ligne, mais cela ne fonctionne pas sur le cookie SessionID! <httpCookies sameSite="Unspecified" />

EDITÉ: Je trouve ceci: https://docs.microsoft.com/en-us/dotnet/api/system.web.configuration.sessionstatesection.cookiesamesite?view=netframework-4.8#System_Web_Configuration_SessionStateSection_CookieSameSite

Définissez le même site pour le serveur d'états par l'attribut "cookieSameSite" de la balise SessionState.

Sadegh
la source
Avez-vous résolu le problème en ajoutant «<sessionstate CookieSameSite»? J'ai installé 4.8, mais lorsque j'accède à la section sessionstate du gestionnaire IIS. Je reçois juste un attribut non reconnu.
Jokies Ding
1
je reçois le même message dans iis, mais cela fonctionne et change la valeur de samesite en temps de set-cookie. j'ajoute cookieSameSite = "None" à mon web.config pour obtenir le comportement précédent. notez que cookieSameSite est caseSesitive.
Sadegh
J'ai juste eu à patcher un site hérité 4.5.2 pour cela - SameSite n'était pas pris en charge par les configurations, j'ai donc dû intercepter le cookie sur Session_Start et le réécrire directement avec "SameSite = None; Secure" ajouté.
ParanoidCoder
@ParanoidCoder vous réservoir pour votre suggestion, j'utilise .net 4.6.1 et cela fonctionne pour moi. Mais j'ai une question sur votre solution: vous utilisez la réécriture d'URL (extension d'IIS) ou vous la réécrivez par code dans Session_Start, pouvez-vous me montrer votre code?
Sadegh

Réponses:

19

Ajoutez ces options à web.config pour sameSite = None, Lax ou Strict

<system.web>
    <httpCookies sameSite="None"/>
    <sessionState cookieSameSite="None" />
    <authentication mode="Forms">
        <forms cookieSameSite="None" />
    </authentication>
HJ van der Wijk
la source
1
<httpCookies sameSite
n'apparaît
Cela fonctionne-t-il pour le cadre 4.6.1?
Ankush Jain
@AnkushJain, non, il est pris en charge depuis .Net Framework 4.7.2.
Vasiliy Zverev
11

Je ne peux pas utiliser la réécriture, car UrlRewrite n'est pas installé sur tous les serveurs de mes clients.

Enfin j'ajoute cookieSameSite à mon web.config:

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

Sadegh
la source
2
cela ne fonctionne qu'après .net 4.7.2
mrlayeghi
1
je l'utilise dans .net 4.6.1 et cela fonctionne très bien.
Sadegh
Je suis désolé @ Sadegh.K, mais cela ne fonctionnera pas avant 4.7.2 comme indiqué ici: docs.microsoft.com/en-us/aspnet/samesite/…
cederlof
@cederlof j'ai trouvé ceci: support.microsoft.com/en-us/help/4533011/kb4533011
Sadegh
@Sadegh Oui, mais cela n'ajoute pas la cookieSameSitefonctionnalité à web.config - .NET 4.7.2 le fait. Le lien que j'ai publié dans mon commentaire est également lié à la page à laquelle vous vous référez.
cederlof
8

L'attribut CookieSameSite n'est pas disponible pour de nombreux frameworks plus anciens. Si vous êtes dans une situation où la réponse acceptée n'est pas prise en charge dans votre environnement, lisez la suite!

J'ai modifié plusieurs réponses SO pour arriver à cette réécriture d'URL qui ajoute SameSite=Noneaux cookies de session, et aussi supprimer SameSite=Nonede tous les cookies pour la plupart des navigateurs incompatibles. Le but de cette réécriture est de conserver le comportement "hérité" pré-Chrome 80.

Rédaction complète sur mon 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>

Cela devrait fonctionner pour la plupart des applications ASP .Net et ASP .Net Core, bien que les cadres plus récents disposent de code et d'options de configuration appropriés pour vous permettre de contrôler ce comportement. Je recommanderais de rechercher toutes les options disponibles avant d'utiliser ma réécriture ci-dessus.

zemien
la source
Où mettez-vous cela dans MVC 5? Dans <system.net></system.net>?
Joel Wiklund
In<system.webServer>
zemien
Remarque: si le cookie ASP.NET_SessionId a déjà SameSite=Laxcela, il ne fera que l'ajouter SameSite=Noneet ne le remplacera pas.
cederlof
@zemien Je ne comprends pas pourquoi avoir du (SameSite=.*)?tout dans le motif?
cederlof
1
@cederlof vous avez raison! Je n'ai pas testé correctement mon expression régulière car mon environnement était un framework .Net plus ancien qui n'ajoutait pas automatiquement la propriété Lax. Dans votre cas, vous pouvez utiliser une expression régulière différente pour exclure l'en- SameSite=Laxtête: ((.*)(ASP.NET_SessionId)(=.*))(?=SameSite)voir regex101.com/r/7D9UdO/3 mise à jour - cependant, notez que cette expression régulière exclura tout ce que vous voudrez par la suite, comme l'en-tête sécurisé. Cela devrait être une condition rare, donc le point clé est de voir ce que votre OS + framework + app émet et d'écrire l'expression rationnelle appropriée. Je
mettrai à
7

Dernière mise à jour: la réponse de zemien est plus complète et complète que la mienne. car il définit un cookie basé sur l'agent utilisateur.

Ma réponse:

Vous pouvez remplacer SameSite = Lax par SameSite = None pour ASP.NET_SessionId dans web.config de la manière suivante:

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

Mise à jour: pour éviter un problème IOS , remplacez

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

avec

<action type="Rewrite" value="{R:1};" />
Mohammad Reza Sadreddini
la source
2
Cela n'est possible que si le module de réécriture IIS est installé sur le serveur
Vincent Ducroquet
1
Votre problème de mise à jour pour iOS entraînera également des problèmes dans les nouveaux systèmes d'exploitation. Fondamentalement, certains navigateurs / OS attribueront SameSite = Lax s'il manque l'en-tête SameSite. Je crois que la seule façon est de flairer UserAgent et de décider d'inclure ou non l'en-tête. Je recherche toujours si cela peut être fait via web.config ou s'il doit inclure un changement de code dans Session_Start.
zemien
Juste pour mettre en évidence ce qu'écrit @zemien, votre mise à jour iOS corrige un problème mais en introduit un autre.
cederlof
3

@zemien votre solution a correctement résolu nos problèmes de Google Chrome

Nous avons une intégration où notre application est intégrée dans un iframe sur un tiers. La version 80 de Chrome publiée le 4 février 2020 a empêché le chargement des cookies.

Cependant, j'ai dû modifier le modèle pour capturer tous les cookies, ajouter l'indicateur sécurisé et condition de ne pas appliquer la réécriture sur localhost pour notre environnement local non 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
la source
1

Travaille pour moi. Ajouté dans mon fichier web.config:

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

Mise à niveau vers .NET Framework 4.8 + correctif d'installation: mise à jour cumulative 2019-12 pour .NET Framework 3.5 et 4.8 pour Windows 10 version 1909 pour x64 (KB4533002)

Stéphane
la source