Baca dalam bahasa Inggris

Bagikan melalui


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 Nonenilai sama sekali. Jika Anda ingin tidak mengeluarkan 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 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 MVC

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.

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 saat Anda mengklik tombol "Buat Cookie" memiliki nilai atribut SameSite , Laxyang cocok dengan nilai yang ditetapkan dalam kode sampel.

Mencegat cookie yang tidak Anda kontrol

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

Informasi Lebih Lanjut

Updates Chrome

Dokumentasi OWIN SameSite

Dokumentasi ASP.NET

Patch .NET SameSite