Przykład pliku cookie sameSite dla ASP.NET 4.7.2 C# 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
HttpCookie sameSiteCookie = new HttpCookie("SameSiteSample");
// Set a value for the cookieSite none.
// Note this will also require you to be running on HTTPS
sameSiteCookie.Value = "sample";
// Set the secure flag, which Chrome's changes will require for Same
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);
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.cs 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 muszą być następnie skonfigurowane do używania narzędzia CookieManager w klasie uruchamiania;
public void Configuration(IAppBuilder app)
{
app.UseCookieAuthentication(new CookieAuthenticationOptions
{
CookieSameSite = SameSiteMode.None,
CookieHttpOnly = true,
CookieSecure = CookieSecureOption.Always,
CookieManager = new SameSiteCookieManager(new SystemWebCookieManager())
});
}
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ładujesz debuger przeglądarki na początkowej stronie i użyjesz 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 pliki cookie" ma wartość atrybutu SameSite o wartości Lax
, 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 pliku SameSiteCookieRewriter.cs , aby zapoznać się z przykładem obsługi zdarzenia i dostosowania atrybutu pliku cookie sameSite
, który można skopiować do własnego kodu.
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
}
}
});
}
}
}
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 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;
}
}
});
}