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.
Pisanie atrybutu SameSite
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.
Uruchamianie przykładowej aplikacji
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.
Przechwytywanie plików cookie, których nie kontrolujesz
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;
}
}
});
}
Więcej informacji
Opinia
https://aka.ms/ContentUserFeedback.
Dostępne już wkrótce: W 2024 r. będziemy stopniowo wycofywać zgłoszenia z serwisu GitHub jako mechanizm przesyłania opinii na temat zawartości i zastępować go nowym systemem opinii. Aby uzyskać więcej informacji, sprawdź:Prześlij i wyświetl opinię dla