Przeczytaj w języku angielskim

Udostępnij za pośrednictwem


Przykład pliku cookie sameSite dla ASP.NET 4.7.2 VB MVC

.NET Framework 4.7 ma wbudowaną obsługę atrybutu SameSite, ale jest zgodny z oryginalnym standardem. Poprawione zachowanie zmieniło znaczenie SameSite.None emitowania atrybutu z wartością None, a nie emitować wartości w ogóle. Jeśli nie chcesz emitować wartości, możesz ustawić SameSite właściwość na pliku cookie na wartość -1.

Pisanie atrybutu SameSite

Poniżej przedstawiono przykład sposobu pisania atrybutu SameSite na pliku 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)

Jeśli czytasz to w języku innym niż angielski, daj nam znać w tym problemie z dyskusją w usłudze GitHub, jeśli chcesz zobaczyć komentarze kodu w języku natywnym.

Domyślny atrybut sameSite dla stanu sesji jest ustawiony w parametrze "cookieSameSite" ustawień sesji w web.config

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

Uwierzytelnianie MVC

Uwierzytelnianie oparte na plikach cookie OWIN MVC używa menedżera plików cookie, aby umożliwić zmianę atrybutów plików cookie. SameSiteCookieManager.vb to implementacja takiej klasy, którą można skopiować do własnych projektów.

Upewnij się, że składniki Microsoft.Owin zostały uaktualnione do wersji 4.1.0 lub nowszej. Sprawdź plik, packages.config aby upewnić się, że wszystkie numery wersji są zgodne, na przykład.

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

Składniki uwierzytelniania należy skonfigurować tak, aby używały narzędzia CookieManager w klasie uruchamiania;

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

Menedżer plików cookie musi być ustawiony na każdym składniku, który go obsługuje, łącznie z plikami CookieAuthentication i OpenIdConnectAuthentication.

SystemWebCookieManager służy do unikania znanych problemów z integracją plików cookie odpowiedzi.

Uruchamianie przykładowej aplikacji

Jeśli uruchomisz przykładowy projekt, załaduj debuger przeglądarki na początkowej stronie i użyj go do wyświetlenia zbioru plików cookie dla witryny. Aby to zrobić w przeglądarce Edge i Chrome, naciśnij F12 kartę, a następnie Application kliknij adres URL witryny w Cookies obszarze opcji w Storage sekcji.

Lista plików cookie debugera przeglądarki

Na powyższym obrazie widać, że plik cookie utworzony przez przykład po kliknięciu przycisku "Utwórz plik cookie witryny SameSite" ma wartość atrybutu SameSite o Laxwartości , pasując do wartości ustawionej w przykładowym kodzie.

Przechwytywanie plików cookie, których nie kontrolujesz

Program .NET 4.5.2 wprowadził nowe zdarzenie do przechwytywania zapisu nagłówków. Response.AddOnSendingHeaders Może to służyć do przechwytywania plików cookie przed ich powrotem do komputera klienckiego. W przykładzie podłączamy zdarzenie do metody statycznej, która sprawdza, czy przeglądarka obsługuje nowe zmiany tej samej lokacji, a jeśli nie, zmienia pliki cookie, aby nie emitować atrybutu, jeśli nowa None wartość została ustawiona.

Zobacz plik global.asax , aby zapoznać się z przykładem podłączania zdarzenia i sameSiteCookieRewriter.vb , aby zapoznać się z przykładem obsługi zdarzenia i dostosowania atrybutu pliku cookie sameSite , który można skopiować do własnego kodu.

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

Możesz zmienić określone zachowanie nazwanych plików cookie w taki sam sposób; Poniższy przykład dostosowuje domyślny plik cookie uwierzytelniania z Lax do None w przeglądarkach, które obsługują None wartość, lub usuwa ten sam atrybutWitryna w przeglądarkach, które nie obsługują 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

Więcej informacji

Aktualizacje chrome

Dokumentacja usługi OWIN SameSite

Dokumentacja programu ASP.NET

Poprawki platformy .NET SameSite