Compartir a través de


Ejemplo de cookie SameSite para ASP.NET 4.7.2 formularios web de C#

.NET Framework 4.7 tiene compatibilidad integrada con el atributo SameSite , pero cumple el estándar original. El comportamiento ajustado cambió el significado de SameSite.None para emitir el atributo con un valor de None, en lugar de no emitir el valor en absoluto. Si no desea emitir el valor, puede establecer la SameSite propiedad en una cookie en -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 esto en un idioma distinto del inglés, háganoslo saber en este problema de discusión de GitHub si desea ver los comentarios de código en su idioma nativo.

El atributo sameSite predeterminado para una cookie de autenticación de formularios se establece en el cookieSameSite parámetro 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 como lax 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, a continuación, agregue el código de interceptación que se muestra a continuación para ajustar el comportamiento en función de la none funcionalidad del explorador.

Ejecución del ejemplo

Si ejecutas el proyecto de ejemplo, abre el depurador del navegador en la página inicial y úsalo 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.

Lista de cookies del depurador del explorador

Puede ver en la imagen anterior 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.

Interceptar cookies que no controla

.NET 4.5.2 introdujo un nuevo evento para interceptar la escritura de encabezados, Response.AddOnSendingHeaders. Esto se puede usar para interceptar las cookies antes de que se devuelvan al equipo cliente. En el ejemplo se conecta el evento con un método estático que comprueba si el navegador admite los nuevos cambios sameSite y, si no es así, cambia las cookies para que no emitan el atributo si se ha establecido el nuevo valor de None.

Consulte global.asax para obtener un ejemplo de enlace del evento y SameSiteCookieRewriter.cs para obtener un ejemplo de cómo controlar el evento y ajustar el atributo 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 específico de las cookies con nombre de la misma manera; El ejemplo siguiente ajusta la cookie de autenticación predeterminada de Lax a None en los exploradores que admiten el None valor o quita el mismo atributoSite en los 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;
            }
        }
    });
}

Más Información

Actualizaciones de Chrome

Documentación de ASP.NET

Parches SameSite de .NET