Leggere in inglese

Condividi tramite


Esempio di cookie SameSite per ASP.NET WebForms 4.7.2 VB

.NET Framework 4.7 include il supporto predefinito per l'attributo SameSite , ma è conforme allo standard originale. Il comportamento con patch ha modificato il significato di SameSite.None per generare l'attributo con un valore , Noneanziché generare il valore. Se si desidera non generare il valore, è possibile impostare la SameSite proprietà su un cookie su -1.

Scrittura dell'attributo SameSite

Di seguito è riportato un esempio di come scrivere un attributo SameSite in un cookie;

' Create the cookie
Dim sameSiteCookie As 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

' Expire the cookie in 1 minute
sameSiteCookie.Expires = Date.Now.AddMinutes(1)

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

Se si sta leggendo questa operazione in una lingua diversa dall'inglese, segnalarlo in questo problema di discussione su GitHub se si vogliono visualizzare i commenti del codice nella lingua nativa.

L'attributo predefinito sameSite per un cookie di autenticazione basata su form viene impostato nel cookieSameSite parametro delle impostazioni di autenticazione basata su form in web.config

<system.web>
  <authentication mode="Forms">
    <forms name=".ASPXAUTH" loginUrl="~/" cookieSameSite="None" requireSSL="true">
    </forms>
  </authentication>
</system.web>

L'attributo predefinito sameSite per lo stato della sessione viene impostato anche nel parametro 'cookieSameSite' delle impostazioni della sessione in web.config

<system.web>
  <sessionState cookieSameSite="None">     
  </sessionState>
</system.web>

L'aggiornamento di novembre 2019 a .NET ha modificato le impostazioni predefinite per l'autenticazione basata su form e la sessione lax come è l'impostazione più compatibile, tuttavia se si incorporano pagine in iframe potrebbe essere necessario ripristinare questa impostazione su Nessuno e quindi aggiungere il codice di intercettazione illustrato di seguito per modificare il comportamento in base alla funzionalità del none browser.

Esecuzione dell'esempio

Se si esegue il progetto di esempio, caricare il debugger del browser nella pagina iniziale e usarlo per visualizzare la raccolta di cookie per il sito. A tale scopo, in Edge e Chrome premere F12 quindi selezionare la Application scheda e fare clic sull'URL del sito sotto l'opzione Cookies nella Storage sezione.

Elenco cookie del debugger del browser

È possibile vedere dall'immagine precedente che il cookie creato dall'esempio quando si fa clic sul pulsante "Crea cookie" ha un valore di attributo SameSite pari Laxa , che corrisponde al valore impostato nel codice di esempio.

Intercettazione dei cookie non controllate

.NET 4.5.2 ha introdotto un nuovo evento per intercettare la scrittura di intestazioni, Response.AddOnSendingHeaders. Questa operazione può essere usata per intercettare i cookie prima che vengano restituiti al computer client. Nell'esempio si collega l'evento a un metodo statico che controlla se il browser supporta le modifiche dello stesso sito e, in caso contrario, modifica i cookie per non generare l'attributo se il nuovo None valore è stato impostato.

Vedere global.asax per un esempio di associazione dell'evento e SameSiteCookieRewriter.cs per un esempio di gestione dell'evento e modifica dell'attributo cookie sameSite .

Sub FilterSameSiteNoneForIncompatibleUserAgents(ByVal sender As Object)
    Dim application As HttpApplication = TryCast(sender, HttpApplication)

    If application IsNot Nothing Then
        Dim userAgent = application.Context.Request.UserAgent

        If SameSite.DisallowsSameSiteNone(userAgent) Then
            application.Response.AddOnSendingHeaders(
                Function(context)
                    Dim cookies = context.Response.Cookies

                    For i = 0 To cookies.Count - 1
                        Dim cookie = cookies(i)

                        If cookie.SameSite = SameSiteMode.None Then
                            cookie.SameSite = CType((-1), SameSiteMode)
                        End If
                    Next
                End Function)
        End If
    End If
End Sub

È possibile modificare il comportamento specifico dei cookie denominati nello stesso modo; L'esempio seguente regola il cookie di autenticazione predefinito da Lax a None nei browser che supportano il None valore o rimuove lo stesso attributoSite nei browser che non supportano None.

Public Shared Sub AdjustSpecificCookieSettings()
    HttpContext.Current.Response.AddOnSendingHeaders(Function(context)
            Dim cookies = context.Response.Cookies

            For i = 0 To cookies.Count - 1
            Dim cookie = cookies(i)

            If String.Equals(".ASPXAUTH", cookie.Name, StringComparison.Ordinal) Then

                If SameSite.BrowserDetection.DisallowsSameSiteNone(userAgent) Then
                    cookie.SameSite = -1
                Else
                    cookie.SameSite = SameSiteMode.None
                End If

                cookie.Secure = True
            End If
            Next
        End Function)
End Sub

Altre informazioni

Aggiornamenti chrome

Documentazione di ASP.NET

Patch dello stesso sito .NET