¿Cómo se agrega automáticamente el atributo SameSite a mi cookie Asp.net_SessionID?

20

¡Recientemente samesite = lax agrega automáticamente a mi cookie de sesión! este atributo solo se agrega a sessionID: "Set-Cookie ASP.NET_SessionId=zana3mklplqwewhwvika2125; path=/; HttpOnly; **SameSite=Lax**"

Mi sitio web está alojado en IIS 8.5, Windows 2012 R2 y no tiene WAF o UrlRewrite y apago AntiVirus (kasper).

pero aún tiene el mismo problema en algunos servidores de clientes.

¿alguna idea?

EDITADO: Encuentro esto: https://support.microsoft.com/en-us/help/4524419/kb4524419

ASP.NET ahora emitirá un encabezado de cookie SameSite cuando el valor HttpCookie.SameSite sea 'None' para acomodar los próximos cambios en el manejo de cookies SameSite en Chrome. Como parte de este cambio, las cookies FormsAuth y SessionState también se emitirán con SameSite = 'Lax' en lugar del valor predeterminado anterior de 'None', aunque estos valores se pueden anular en web.config.

¿Cómo puedo anular las cookies de samesite para SessionState en web.config? Agrego esta línea, pero no funciona en la cookie SessionID. <httpCookies sameSite="Unspecified" />

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

Establezca samesite para stateerver mediante el atributo "cookieSameSite" de la etiqueta SessionState.

Sadegh
fuente
¿Lo resolvió agregando "<sessionstate CookieSameSite"? 4.8 Tengo 4.8 instalado pero cuando accedo a la sección sessionstate del administrador de IIS. Acabo de recibir un atributo no reconocido.
Jokies Ding
1
Recibo el mismo mensaje en iis, pero funciona y cambia el valor de samesite en el tiempo establecido de cookies. agrego cookieSameSite = "None" a mi web.config para obtener un comportamiento previo. observe que cookieSameSite es caseSesitive.
Sadegh
Solo tuve que parchear un sitio heredado 4.5.2 para esto: SameSite no era compatible con las configuraciones, así que tuve que interceptar la cookie en Session_Start y volver a escribirla directamente con "SameSite = None; Secure" agregado.
ParanoidCoder
@ParanoidCoder le agradece su sugerencia, uso .net 4.6.1 y funciona para mí. Pero tengo una pregunta sobre su solución: usa reescritura de URL (extensión de IIS) o la reescribe por código en Session_Start, ¿puede mostrarme su código?
Sadegh

Respuestas:

19

Agregue estas opciones a web.config para sameSite = None, Lax o Strict

<system.web>
    <httpCookies sameSite="None"/>
    <sessionState cookieSameSite="None" />
    <authentication mode="Forms">
        <forms cookieSameSite="None" />
    </authentication>
HJ van der Wijk
fuente
1
<httpCookies sameSiteno se muestra como una opción válida en .Net Framework 4.8
IronSean
¿Funciona para el marco 4.6.1?
Ankush Jain
@AnkushJain, no, es compatible desde .Net Framework 4.7.2.
Vasiliy Zverev
11

No puedo usar rewrite, porque UrlRewrite no está instalado en todos los servidores de mis clientes.

Finalmente agrego cookieSameSite a mi web.config:

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

Sadegh
fuente
2
solo funciona después de .net 4.7.2
mrlayeghi
1
Lo uso en .net 4.6.1 y funciona bien.
Sadegh
Lo siento @ Sadegh.K, pero no funcionará antes de 4.7.2 como se indica aquí: docs.microsoft.com/en-us/aspnet/samesite/…
cederlof
@cederlof encontré esto: support.microsoft.com/en-us/help/4533011/kb4533011
Sadegh
@Sadegh Correcto, pero eso no agrega la cookieSameSitefuncionalidad a web.config - .NET 4.7.2 sí. El enlace que publiqué en mi comentario también está vinculado desde la página a la que se refiere.
cederlof
8

El atributo CookieSameSite no está disponible para muchos marcos antiguos. Si se encuentra en una situación en la que la respuesta aceptada no es compatible con su entorno, ¡siga leyendo!

Modifiqué varias respuestas SO para obtener esta reescritura de URL que se agrega SameSite=Nonea las cookies de sesión y también se elimina SameSite=Nonede todas las cookies para la mayoría de los navegadores incompatibles. El objetivo de esta reescritura es preservar el comportamiento "heredado" anterior a Chrome 80.

Escritura completa en mi blog de primera línea del codificador :

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

Esto debería funcionar para la mayoría de las aplicaciones ASP .Net y ASP .Net Core, aunque los Frameworks más nuevos tienen el código y las opciones de configuración adecuados para permitirle controlar este comportamiento. Recomiendo investigar todas las opciones disponibles antes de usar mi reescritura anterior.

zemien
fuente
¿Dónde pones esto en MVC 5? En <system.net></system.net>?
Joel Wiklund
En<system.webServer>
zemien
Nota: si la cookie ASP.NET_SessionId ya tiene SameSite=Laxesto, solo se agregará SameSite=Noney no se reemplazará.
cederlof
@zemien No entiendo ¿por qué tener (SameSite=.*)?el patrón en absoluto?
cederlof
1
@cederlof tienes razón! No probé mi expresión regular correctamente porque mi entorno era más antiguo .Net framework que no agregaba la propiedad Lax automáticamente. En su caso, puede usar una expresión regular diferente para excluir el SameSite=Laxencabezado: ((.*)(ASP.NET_SessionId)(=.*))(?=SameSite)consulte regex101.com/r/7D9UdO/3 actualizado ; sin embargo, tenga en cuenta que esta expresión regular excluirá cualquier cosa que desee después, como el encabezado seguro. Esta debería ser una condición rara, por lo que el punto clave es ver qué está emitiendo su aplicación OS + framework + y escribir la expresión regular para adaptarse. Actualizaré mi respuesta para reflejar ambas formas :)
zemien
7

Última actualización: la respuesta de zemien es más completa y completa que la mía. porque establece cookies basadas en el agente de usuario.

Mi respuesta:

Puede reemplazar SameSite = Lax con SameSite = None para ASP.NET_SessionId en web.config de la siguiente manera:

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

Actualización: para evitar el problema de iOS , reemplace

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

con

<action type="Rewrite" value="{R:1};" />
Mohammad Reza Sadreddini
fuente
2
Esto es posible solo si el módulo de reescritura de IIS está instalado en el servidor
Vincent Ducroquet
1
Su actualización para el problema de iOS también causará problemas en los sistemas operativos más nuevos. Básicamente hablando, algunos navegadores / SO asignarán SameSite = Lax si le falta el encabezado SameSite. Creo que la única forma es hacer un rastreo de UserAgent y decidir si se incluye el encabezado o no. Todavía estoy investigando si esto se puede hacer a través de web.config o si debe incluir un cambio de código en Session_Start.
zemien
Solo para resaltar lo que escribe @zemien, su actualización de iOS soluciona un problema pero presenta otro.
cederlof
3

@zemien su solución resolvió correctamente nuestros problemas de Google Chrome

Tenemos una integración donde nuestra aplicación está incrustada en un iframe en un tercero. La versión 80 de Chrome lanzada el 4 de febrero de 2020 evitó que se cargaran las cookies.

Sin embargo, tuve que modificar el patrón para capturar todas las cookies, agregar el indicador de seguridad y la condición para no aplicar la reescritura en localhost para nuestro entorno local no 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
fuente
1

Funciona para mi. Agregado a mi archivo web.config:

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

Actualice a .Net Framework 4.8 + parche de instalación: actualización acumulativa 2019-12 para .NET Framework 3.5 y 4.8 para Windows 10 versión 1909 para x64 (KB4533002)

Stéphane
fuente