Nota:
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
.NET Framework 4.7 tiene compatibilidad integrada con el atributo SameSite, pero se adhiere al estándar original.
El comportamiento revisado cambió el significado de SameSite.None para que se emita el atributo con un valor de None, en lugar de no emitir ningún valor. Si no desea emitir el valor, puede establecer la propiedad SameSite en una cookie como -1.
Escritura del atributo SameSite
A continuación, se muestra un ejemplo de cómo escribir un atributo SameSite en una cookie;
// Create the cookie
HttpCookie sameSiteCookie = new HttpCookie("SameSiteSample");
// Set a value for the cookie
sameSiteCookie.Value = "sample";
// Set the secure flag, which Chrome's changes will require for SameSite none.
// Note this will also require you to be running on HTTPS
sameSiteCookie.Secure = true;
// Set the cookie to HTTP only which is good practice unless you really do need
// to access it client side in scripts.
sameSiteCookie.HttpOnly = true;
// Add the SameSite attribute, this will emit the attribute with a value of none.
// To not emit the attribute at all set the SameSite property to -1.
sameSiteCookie.SameSite = SameSiteMode.None;
// Add the cookie to the response cookie collection
Response.Cookies.Add(sameSiteCookie);
Si está leyendo este contenido en un idioma que no es el inglés, díganos si le gustaría que los comentarios sobre el código estuviesen en escritos en su idioma. Puede hacerlo en este artículo de discusión de GitHub.
El atributo sameSite predeterminado para una cookie de autenticación de formularios se establece en el parámetro cookieSameSite de la configuración de autenticación de formularios en web.config
<system.web>
<authentication mode="Forms">
<forms name=".ASPXAUTH" loginUrl="~/" cookieSameSite="None" requireSSL="true">
</forms>
</authentication>
</system.web>
El atributo sameSite predeterminado para el estado de sesión también se establece en el parámetro "cookieSameSite" de la configuración de sesión en web.config
<system.web>
<sessionState cookieSameSite="None">
</sessionState>
</system.web>
La actualización de noviembre de 2019 a .NET cambió la configuración predeterminada de autenticación y sesión de formularios a lax, ya que es la configuración más compatible, pero si inserta páginas en iframes, puede que tenga que revertir esta configuración a Ninguno y agregar el código de interceptación que se muestra a continuación para ajustar el comportamiento none en función de la funcionalidad del explorador.
Ejecución del ejemplo
Si ejecuta el proyecto de ejemplo, cargue el depurador del explorador en la página inicial y úselo para ver la colección de cookies del sitio.
Para ello, en Edge y Chrome, presione F12, seleccione la pestaña Application y haga clic en la dirección URL del sitio en la opción Cookies de la sección Storage.

En la imagen anterior, puede ver que la cookie creada por el ejemplo al hacer clic en el botón "Crear cookies" tiene un valor de atributo SameSite de Lax, que coincide con el valor establecido en el código de ejemplo.
Intercepción de cookies no controladas
.NET 4.5.2 introdujo un nuevo evento para interceptar la escritura de encabezados, Response.AddOnSendingHeaders. Se puede utilizar para interceptar las cookies antes de que se devuelvan a la máquina cliente. En el ejemplo, se establece el evento en un método estático que comprueba si el explorador admite los nuevos cambios en sameSite y, si no es así, cambia las cookies para que no emitan el atributo si se ha establecido el nuevo valor None.
Consulte global.asax para conocer un ejemplo de enlazado del evento y SameSiteCookieRewriter.cs para obtener un ejemplo de cómo controlar el evento y ajustar el atributo de cookie sameSite.
public static void FilterSameSiteNoneForIncompatibleUserAgents(object sender)
{
HttpApplication application = sender as HttpApplication;
if (application != null)
{
var userAgent = application.Context.Request.UserAgent;
if (SameSite.BrowserDetection.DisallowsSameSiteNone(userAgent))
{
HttpContext.Current.Response.AddOnSendingHeaders(context =>
{
var cookies = context.Response.Cookies;
for (var i = 0; i < cookies.Count; i++)
{
var cookie = cookies[i];
if (cookie.SameSite == SameSiteMode.None)
{
cookie.SameSite = (SameSiteMode)(-1); // Unspecified
}
}
});
}
}
}
Puede cambiar el comportamiento de las cookies con nombre específico de la misma manera; el ejemplo siguiente ajusta la cookie de autenticación predeterminada de Lax a None en exploradores que admiten el valor None, o quita el atributo sameSite en exploradores que no admiten None.
public static void AdjustSpecificCookieSettings()
{
HttpContext.Current.Response.AddOnSendingHeaders(context =>
{
var cookies = context.Response.Cookies;
for (var i = 0; i < cookies.Count; i++)
{
var cookie = cookies[i];
// Forms auth: ".ASPXAUTH"
// Session: "ASP.NET_SessionId"
if (string.Equals(".ASPXAUTH", cookie.Name, StringComparison.Ordinal))
{
if (SameSite.BrowserDetection.DisallowsSameSiteNone(userAgent))
{
cookie.SameSite = -1;
}
else
{
cookie.SameSite = SameSiteMode.None;
}
cookie.Secure = true;
}
}
});
}