Przykładowy plik cookie SameSite dla ASP.NET 4.7.2 C# WebForms
.NET Framework 4.7 ma wbudowaną obsługę atrybutu SameSite, ale jest zgodny z oryginalnym standardem.
Poprawione zachowanie zmieniło znaczenie SameSite.None
, aby emitować atrybut 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 -1.
Poniżej przedstawiono przykładowy sposób pisania atrybutu SameSite w pliku cookie;
// Create the cookie
HttpCookie sameSiteCookie = 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;
// 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 twoim języku natywnym.
Domyślny atrybut sameSite dla pliku cookie uwierzytelniania formularzy jest ustawiany w cookieSameSite
parametrze ustawień uwierzytelniania formularzy w programie web.config
<system.web>
<authentication mode="Forms">
<forms name=".ASPXAUTH" loginUrl="~/" cookieSameSite="None" requireSSL="true">
</forms>
</authentication>
</system.web>
Domyślny atrybut sameSite dla stanu sesji jest również ustawiony w parametrze "cookieSameSite" ustawień sesji w web.config
<system.web>
<sessionState cookieSameSite="None">
</sessionState>
</system.web>
Aktualizacja z listopada 2019 r. na platformę .NET zmieniła domyślne ustawienia uwierzytelniania i sesji lax
formularzy na tak, jak jest to najbardziej zgodne ustawienie, jednak w przypadku osadzania stron w elementach iframe może być konieczne przywrócenie tego ustawienia na Wartość Brak, a następnie dodanie poniższego kodu przechwytywania w celu dostosowania none
zachowania w zależności od możliwości przeglądarki.
Jeśli uruchomisz przykładowy projekt, załadujesz debuger przeglądarki na stronie początkowej i użyjesz go do wyświetlenia zbioru plików cookie dla witryny.
Aby to zrobić w przeglądarce Microsoft Edge i Chrome, naciśnij F12
klawisz , a następnie wybierz Application
kartę i 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 Lax
SameSite o wartości , pasując do wartości ustawionej w przykładowym kodzie.
Platforma .NET 4.5.2 wprowadziła nowe zdarzenie do przechwytywania zapisywania 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 witryny sameSite, 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
.
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żna zmienić określone nazwane zachowanie pliku 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 atrybut Witryny 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;
}
}
});
}