Leggere in inglese

Condividi tramite


Esempio di cookie SameSite per ASP.NET 4.7.2 VB MVC

.NET Framework 4.7 ha il supporto predefinito per l'attributo SameSite , ma rispetta lo standard originale. Il comportamento con patch ha modificato il significato di SameSite.None per generare l'attributo con un valore di None, anziché non generare il valore in tutto. Se si vuole 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 legge questa operazione in una lingua diversa dall'inglese, in questo problema di discussione su GitHub è possibile visualizzare i commenti del codice nella lingua nativa.

Lo stesso attributo defaultSite per lo stato della sessione viene impostato nel parametro 'cookieSameSite' delle impostazioni della sessione in web.config

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

Autenticazione MVC

L'autenticazione basata su cookie OWIN MVC usa una gestione cookie per abilitare la modifica degli attributi dei cookie. SameSiteCookieManager.vb è un'implementazione di tale classe che è possibile copiare nei propri progetti.

È necessario assicurarsi che i componenti Microsoft.Owin siano tutti aggiornati alla versione 4.1.0 o successiva. Controllare il packages.config file per assicurarsi che tutti i numeri di versione corrispondano, ad esempio.

<?xml version="1.0" encoding="utf-8"?>
<packages>
  <!-- other packages -->
  <package id="Microsoft.Owin.Host.SystemWeb" version="4.1.0" targetFramework="net472" />
  <package id="Microsoft.Owin.Security" version="4.1.0" targetFramework="net472" />
  <package id="Microsoft.Owin.Security.Cookies" version="4.1.0" targetFramework="net472" />
  <package id="Microsoft.Web.Infrastructure" version="1.0.0.0" targetFramework="net472" />
  <package id="Owin" version="1.0" targetFramework="net472" />
</packages>

I componenti di autenticazione devono essere configurati per usare CookieManager nella classe di avvio;

Public Sub Configuration(app As IAppBuilder)
    app.UseCookieAuthentication(New CookieAuthenticationOptions() With {
        .CookieSameSite = SameSiteMode.None,
        .CookieHttpOnly = True,
        .CookieSecure = CookieSecureOption.Always,
        .CookieManager = New SameSiteCookieManager(New SystemWebCookieManager())
    })
End Sub

Una gestione cookie deve essere impostata su ogni componente che lo supporta, che include CookieAuthentication e OpenIdConnectAuthentication.

SystemWebCookieManager viene usato per evitare problemi noti con l'integrazione dei cookie di risposta.

Esecuzione dell'esempio

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

Elenco dei cookie del debugger del browser

È possibile vedere dall'immagine precedente che il cookie creato dall'esempio quando si fa clic sul pulsante "Create SameSite Cookie" ha un valore di attributo SameSite di Lax, corrispondente al valore impostato nel codice di esempio.

Intercettare i cookie che non controllano

.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 viene eseguito il collegamento dell'evento a un metodo statico che verifica 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 collegamento all'evento e SameSiteCookieRewriter.vb per un esempio di gestione dell'evento e modifica dell'attributo cookie sameSite che è possibile copiare nel proprio codice.

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

Documentazione di ASP.NET

Patch .NET SameSite