SameSite adalah
ekstensi 2016
untuk cookie HTTP yang dimaksudkan untuk mengurangi pemalsuan permintaan situs silang (CSRF). Desain asli adalah fitur opt-in yang dapat digunakan dengan menambahkan properti SameSite baru ke cookie. Itu memiliki dua nilai, Lax dan Strict.
Mengatur nilai ke Lax menunjukkan cookie harus dikirim pada navigasi dalam situs yang sama, atau melalui navigasi DAPATKAN ke situs Anda dari situs lain. Nilai Strict membatasi cookie untuk permintaan yang hanya berasal dari situs yang sama. Tidak menyetel properti sama sekali tidak membatasi bagaimana cookie mengalir dalam permintaan. Operasi otentikasi OpenIdConnect (mis. Login, logout), dan fitur lain yang mengirim permintaan POST dari situs eksternal ke situs yang meminta operasi, dapat menggunakan cookie untuk korelasi dan / atau perlindungan CSRF. Operasi ini harus memilih keluar dari SameSite, dengan tidak menyetel properti sama sekali, untuk memastikan cookie ini akan dikirim selama aliran permintaan khusus mereka.
Google sekarang
memperbarui standar dan menerapkan perubahan yang diusulkan di versi Chrome yang akan datang. Perubahan menambahkan nilai SameSite baru, "Tidak Ada", dan mengubah perilaku default menjadi "Lax". Ini memecah login OpenIdConnect, dan berpotensi fitur lain yang dapat diandalkan situs web Anda, fitur ini harus menggunakan cookie yang properti SameSite-nya disetel ke nilai "Tidak Ada".
Namun browser yang mematuhi standar asli dan tidak menyadari nilai baru memiliki perilaku yang berbeda dengan browser yang menggunakan standar baru karena standar SameSite menyatakan bahwa jika browser melihat nilai untuk SameSite, ia tidak memahaminya harus memperlakukan nilai tersebut sebagai "Ketat." Ini berarti situs web .NET Anda sekarang harus menambahkan sniffing agen pengguna untuk memutuskan apakah Anda mengirim nilai None yang baru, atau tidak mengirim atribut sama sekali.

.NET akan mengeluarkan pembaruan untuk mengubah perilaku perilaku atribut SameSite di .NET 4.7.2 dan .NET Core 2.1 dan di atasnya untuk mencerminkan pengenalan nilai baru Google. Pembaruan untuk .NET Framework akan tersedia pada 19 November sebagai pembaruan opsional melalui Pembaruan Microsoft dan WSUS jika Anda menggunakan fungsionalitas "Periksa Pembaruan". Pada 10 Desember akan tersedia secara luas dan muncul dalam Pembaruan Microsoft tanpa Anda harus secara khusus memeriksa pembaruan. Pembaruan .NET Core akan tersedia dengan .NET Core 3.1 dimulai dengan pratinjau 1, pada bulan November.
.NET Core 3.1 akan berisi
definisi enum yang diperbarui , SameSite.Tidak ditentukan yang tidak akan mengatur properti SameSite.
Middleware OpenIdConnect untuk Microsoft.Owin v4.1 dan .NET Core akan diperbarui pada saat yang sama dengan pembaruan .NET Framework dan .NET, namun kami tidak dapat memperkenalkan kode sniffing agen pengguna ke dalam kerangka kerja, ini harus diterapkan di kode situs. Implementasi sniffing agen akan bervariasi sesuai dengan versi ASP.NET atau ASP.NET Core apa yang Anda gunakan dan browser yang ingin Anda dukung.
Untuk ASP.NET 4.7.2 dengan Microsoft.Owin 4.1.0 agen sniffing dapat diimplementasikan menggunakan
ICookieManager ;
public class SameSiteCookieManager : ICookieManager { private readonly ICookieManager _innerManager; public SameSiteCookieManager() : this(new CookieManager()) { } public SameSiteCookieManager(ICookieManager innerManager) { _innerManager = innerManager; } public void AppendResponseCookie(IOwinContext context, string key, string value, CookieOptions options) { CheckSameSite(context, options); _innerManager.AppendResponseCookie(context, key, value, options); } public void DeleteCookie(IOwinContext context, string key, CookieOptions options) { CheckSameSite(context, options); _innerManager.DeleteCookie(context, key, options); } public string GetRequestCookie(IOwinContext context, string key) { return _innerManager.GetRequestCookie(context, key); } private void CheckSameSite(IOwinContext context, CookieOptions options) { if (DisallowsSameSiteNone(context) && options.SameSite == SameSiteMode.None) { options.SameSite = null; } } public static bool DisallowsSameSiteNone(IOwinContext context) { // TODO: Use your User Agent library of choice here. var userAgent = context.Request.Headers["User-Agent"]; return userAgent.Contains("BrokenUserAgent") || userAgent.Contains("BrokenUserAgent2") } }
Dan kemudian konfigurasikan pengaturan OpenIdConnect untuk menggunakan CookieManager baru;
app.UseOpenIdConnectAuthentication( new OpenIdConnectAuthenticationOptions { // … Your preexisting options … CookieManager = new SameSiteCookieManager(new SystemWebCookieManager()) });
SystemWebCookieManager akan memerlukan patch SameSite .NET 4.7.2 atau yang lebih baru diinstal agar berfungsi dengan benar.
Untuk ASP.NET Core Anda harus menginstal tambalan dan kemudian menerapkan kode sniffing agen dalam
kebijakan cookie . Untuk versi sebelum 3.1, ganti SameSiteMode. Tidak ditentukan dengan (SameSiteMode) (- 1).
private void CheckSameSite(HttpContext httpContext, CookieOptions options) { if (options.SameSite > SameSiteMode.Unspecified) { var userAgent = httpContext.Request.Headers["User-Agent"].ToString(); // TODO: Use your User Agent library of choice here. if (/* UserAgent doesn't support new behavior */) { // For .NET Core < 3.1 set SameSite = -1 options.SameSite = SameSiteMode.Unspecified; } } } public void ConfigureServices(IServiceCollection services) { services.Configure<CookiePolicyOptions>(options => { options.MinimumSameSitePolicy = SameSiteMode.Unspecified; options.OnAppendCookie = cookieContext => CheckSameSite(cookieContext.Context, cookieContext.CookieOptions); options.OnDeleteCookie = cookieContext => CheckSameSite(cookieContext.Context, cookieContext.CookieOptions); }); } public void Configure(IApplicationBuilder app) { app.UseCookiePolicy(); // Before UseAuthentication or anything else that writes cookies. app.UseAuthentication(); // … }
Dalam pengujian dengan tim Direktori Aktif Azure kami telah menemukan pemeriksaan berikut ini berfungsi untuk semua agen pengguna umum yang dilihat Direktori Aktif Azure yang tidak memahami nilai baru.
public static bool DisallowsSameSiteNone(string userAgent) { // Cover all iOS based browsers here. This includes: // - Safari on iOS 12 for iPhone, iPod Touch, iPad // - WkWebview on iOS 12 for iPhone, iPod Touch, iPad // - Chrome on iOS 12 for iPhone, iPod Touch, iPad // All of which are broken by SameSite=None, because they use the iOS networking stack if (userAgent.Contains("CPU iPhone OS 12") || userAgent.Contains("iPad; CPU OS 12")) { return true; } // Cover Mac OS X based browsers that use the Mac OS networking stack. This includes: // - Safari on Mac OS X. // This does not include: // - Chrome on Mac OS X // Because they do not use the Mac OS networking stack. if (userAgent.Contains("Macintosh; Intel Mac OS X 10_14") && userAgent.Contains("Version/") && userAgent.Contains("Safari")) { return true; } // Cover Chrome 50-69, because some versions are broken by SameSite=None, // and none in this range require it. // Note: this covers some pre-Chromium Edge versions, // but pre-Chromium Edge does not require SameSite=None. if (userAgent.Contains("Chrome/5") || userAgent.Contains("Chrome/6")) { return true; } return false; }
Daftar peramban ini sama sekali tidak kanonik dan Anda harus memvalidasi bahwa peramban umum dan agen pengguna lain yang didukung sistem Anda berperilaku seperti yang diharapkan setelah pembaruan dilakukan.
Chrome 80 dijadwalkan untuk
mengaktifkan perilaku baru pada bulan Februari atau Maret 2020, termasuk mitigasi sementara yang ditambahkan di Chrome 79 Beta. Jika Anda ingin menguji perilaku baru tanpa mitigasi, gunakan Chromium 76. Versi Chromium yang lebih lama
tersedia untuk diunduh .
Jika Anda tidak dapat memperbarui versi kerangka kerja Anda pada saat Chrome mengubah perilaku baru di awal 2020, Anda mungkin dapat mengubah aliran OpenIdConnect Anda menjadi aliran Kode, daripada aliran implisit default yang digunakan oleh ASP.NET dan ASP.NET Core, tetapi ini harus dilihat sebagai tindakan sementara.
Kami sangat menganjurkan Anda untuk mengunduh versi .NET Framework dan .NET Core yang diperbarui saat tersedia pada bulan November dan mulai merencanakan pembaruan Anda sebelum perubahan Chrome diluncurkan.