Sampel cookie SameSite untuk webForms ASP.NET 4.7.2 C#
.NET Framework 4.7 memiliki dukungan bawaan untuk atribut SameSite, tetapi mematuhi standar asli.
Perilaku yang di-patch mengubah arti untuk memancarkan SameSite.None
atribut dengan nilai , daripada tidak memancarkan None
nilai sama sekali. Jika Anda ingin tidak memancarkan nilai, Anda dapat mengatur SameSite
properti pada cookie ke -1.
Berikut ini adalah contoh cara menulis atribut SameSite pada 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);
Jika Anda membaca ini dalam bahasa selain bahasa Inggris, beri tahu kami dalam masalah diskusi GitHub ini jika Anda ingin melihat komentar kode dalam bahasa asli Anda.
Atribut sameSite default untuk cookie autentikasi formulir diatur dalam cookieSameSite
parameter pengaturan autentikasi formulir di web.config
<system.web>
<authentication mode="Forms">
<forms name=".ASPXAUTH" loginUrl="~/" cookieSameSite="None" requireSSL="true">
</forms>
</authentication>
</system.web>
Atribut sameSite default untuk status sesi juga diatur dalam parameter 'cookieSameSite' dari pengaturan sesi di web.config
<system.web>
<sessionState cookieSameSite="None">
</sessionState>
</system.web>
Pembaruan November 2019 ke .NET mengubah pengaturan default untuk Autentikasi Formulir dan Sesi menjadi lax
sebagai pengaturan yang paling kompatibel, namun jika Anda menyematkan halaman ke iframe, Anda mungkin perlu mengembalikan pengaturan ini ke Tidak Ada, lalu menambahkan kode penyadapan yang ditunjukkan di bawah ini untuk menyesuaikan none
perilaku tergantung pada kemampuan browser.
Jika Anda menjalankan proyek sampel, muat debugger browser Anda di halaman awal dan gunakan untuk melihat kumpulan cookie untuk situs tersebut.
Untuk melakukannya di Edge dan Chrome tekan F12
lalu pilih Application
tab dan klik URL situs di bawah Cookies
opsi di bagian Storage
.
Anda dapat melihat dari gambar di atas bahwa cookie yang dibuat oleh sampel ketika Anda mengklik tombol "Buat Cookie" memiliki nilai Lax
atribut SameSite , yang cocok dengan nilai yang ditetapkan dalam kode sampel.
.NET 4.5.2 memperkenalkan peristiwa baru untuk mencegat penulisan header, Response.AddOnSendingHeaders
. Ini dapat digunakan untuk mencegat cookie sebelum dikembalikan ke komputer klien. Dalam sampel, kami menyambungkan peristiwa ke metode statis yang memeriksa apakah browser mendukung perubahan sameSite baru, dan jika tidak, mengubah cookie untuk tidak memancarkan atribut jika nilai baru None
telah ditetapkan.
Lihat global.asax untuk contoh menghubungkan peristiwa dan SameSiteCookieRewriter.cs untuk contoh penanganan peristiwa dan menyesuaikan atribut 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
}
}
});
}
}
}
Anda dapat mengubah perilaku cookie bernama tertentu dengan cara yang sama; sampel di bawah ini menyesuaikan cookie autentikasi default dari Lax
ke None
pada browser yang mendukung None
nilai, atau menghapus atribut sameSite pada browser yang tidak mendukung 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;
}
}
});
}