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.
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 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.
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.
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 Lax
wartości , pasując do wartości ustawionej w przykładowym kodzie.
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