Sampel cookie SameSite untuk ASP.NET 4.7.2 C# MVC
.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 mengeluarkan 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 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);
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 status sesi diatur dalam parameter 'cookieSameSite' dari pengaturan sesi di web.config
<system.web>
<sessionState cookieSameSite="None">
</sessionState>
</system.web>
Autentikasi berbasis cookie MVC OWIN menggunakan manajer cookie untuk mengaktifkan perubahan atribut cookie. SameSiteCookieManager.cs adalah implementasi dari kelas seperti itu yang dapat Anda salin ke dalam proyek Anda sendiri.
Anda harus memastikan komponen Microsoft.Owin Anda semuanya ditingkatkan ke versi 4.1.0 atau yang lebih tinggi. Periksa file Anda packages.config
untuk memastikan semua nomor versi cocok, misalnya.
<?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>
Komponen autentikasi kemudian harus dikonfigurasi untuk menggunakan CookieManager di kelas startup Anda;
public void Configuration(IAppBuilder app)
{
app.UseCookieAuthentication(new CookieAuthenticationOptions
{
CookieSameSite = SameSiteMode.None,
CookieHttpOnly = true,
CookieSecure = CookieSecureOption.Always,
CookieManager = new SameSiteCookieManager(new SystemWebCookieManager())
});
}
Manajer cookie harus diatur pada setiap komponen yang mendukungnya, ini termasuk CookieAuthentication dan OpenIdConnectAuthentication.
SystemWebCookieManager digunakan untuk menghindari masalah umum dengan integrasi cookie respons.
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 saat Anda mengklik tombol "Buat Cookie" memiliki nilai atribut SameSite , Lax
yang cocok dengan nilai yang ditetapkan dalam kode sampel.
.NET 4.5.2 memperkenalkan acara baru untuk mencegat penulisan header, Response.AddOnSendingHeaders
. Ini dapat digunakan untuk mencegat cookie sebelum dikembalikan ke komputer klien. Dalam sampel kita 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 menangani peristiwa dan menyesuaikan atribut cookie sameSite
yang dapat Anda salin ke dalam kode Anda sendiri.
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
di 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;
}
}
});
}