Baca dalam bahasa Inggris

Bagikan melalui


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 Nonenilai sama sekali. Jika Anda ingin tidak memancarkan nilai, Anda dapat mengatur SameSite properti pada cookie ke -1.

Menulis atribut SameSite

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.

Menjalankan sampel

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 .

Daftar Cookie Debugger Browser

Anda dapat melihat dari gambar di atas bahwa cookie yang dibuat oleh sampel ketika Anda mengklik tombol "Buat Cookie" memiliki nilai Laxatribut SameSite , yang cocok dengan nilai yang ditetapkan dalam kode sampel.

Mencegat cookie yang tidak Anda kontrol

.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;
            }
        }
    });
}

Informasi Lebih Lanjut

Chrome Updates

Dokumentasi ASP.NET

Patch Situs Sama .NET