cookieASP.NET Core ' de SameSite s ile çalışma
Gönderen Rick Anderson
SameSite, siteler arası istek sahteciliği (CSRF) saldırılarına karşı bir koruma sağlamak için tasarlanmış bir IETF taslak standardıdır. 2016içinde orijinal drafted, taslak standart 2019' de güncelleştirildi. Güncelleştirilmiş standart, önceki standartlarla geriye dönük olarak uyumlu değildir ve aşağıdakiler en belirgin farklılıklardır:
- Cookie, SameSite üst bilgisi olmayan s varsayılan olarak kabul edilir
SameSite=Lax. SameSite=Nonesiteler arası kullanıma izin vermek için kullanılmalıdır cookie .- Cookies bu
SameSite=Noneonay ayrıca olarak işaretlenmelidirSecure. - Kullanan uygulamalar
<iframe>sameSite=LaxsameSite=Strictcookie<iframe>, siteler arası senaryolar olarak kabul edildiği için veya öğeleri ile ilgili sorunlar yaşayabilir. - Değerin
SameSite=None2016 standart tarafından yapılmasına izin verilmez ve bazı uygulamaların gibi bu tür öğeleri ele almasına neden olur cookieSameSite=Strict. Bkz. bu belgede eski tarayıcıları destekleme .
Bu SameSite=Lax ayar çoğu uygulama için geçerlidir cookie . openıd Bağlan (oıdc) ve WS-Federation gibi bazı kimlik doğrulama biçimlerinin, temelinde yeniden yönlendirmeler gönderme. POST tabanlı yeniden yönlendirmeler, SameSite tarayıcı korumalarının tetiklenmesi, bu nedenle bu bileşenler için SameSite devre dışı bırakıldı. Çoğu OAuth oturum açma, istek akışının farklılığı nedeniyle etkilenmez.
her bir ASP.NET Core bileşeni, cookie samesite ' ın uygun olup olmadığına karar vermek için gerekir.
SameSite ve Identity
IdentityASP.NET Core , veya tümleştirme gibi gelişmiş senaryolar cookie dışında SameSite'ler tarafından büyük IFrames ölçüde OpenIdConnect etkilenmez.
kullanırken, Identity herhangi bir sağlayıcı ekleme veya cookie çağrısı services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme) yapma, bunu Identity yapar.
SameSite test örnek kodu
Aşağıdaki örnekler indirilebilir ve test edilebilir:
| Örnek | Belge |
|---|---|
| .NET Core MVC | ASP.NET Core 2,1 MVC samesite cookie örneği |
| .NET Core Razor sayfaları | ASP.NET Core 2.1 Razor Sayfaları SameSite cookie örneği |
Aşağıdaki örnek indirilebilir ve test edilebilir:
| Örnek | Belge |
|---|---|
| .NET Core Razor sayfaları | ASP.NET Core 3.1 Razor Pages SameSite cookie örneği |
SameSite özniteliği için .NET Core desteği
.NET Core 2,2 ve üzeri sürümleri, Aralık 2019 ' de güncelleştirmelerin yayımlanmasından bu yana SameSite için 2019 taslak standardını destekler. Geliştiriciler özelliği kullanarak sameSite özniteliğinin değerini programlı bir şekilde denetleyebilir HttpCookie.SameSite . SameSiteÖzelliği Strict, LAX veya None olarak ayarlamak, bu değerlerin ile ağda yazıldığı sonuçlara neden olur cookie . Şuna eşit ayarı (SameSiteMode)(-1) , ağ üzerinde şu şekilde bir sameSite özniteliği ekleneceğini belirtir cookie
var cookieOptions = new CookieOptions
{
// Set the secure flag, which Chrome's changes will require for SameSite none.
// Note this will also require you to be running on HTTPS.
Secure = true,
// Set the cookie to HTTP only which is good practice unless you really do need
// to access it client side in scripts.
HttpOnly = true,
// Add the SameSite attribute, this will emit the attribute with a value of none.
// To not emit the attribute at all set
// SameSite = (SameSiteMode)(-1)
SameSite = SameSiteMode.None
};
// Add the cookie to the response cookie collection
Response.Cookies.Append("MyCookie", "cookieValue", cookieOptions);
.NET Core 3,1 ve üzeri, güncelleştirilmiş SameSite değerlerini destekler ve sabit listesine ek bir sabit listesi değeri ekler SameSiteMode.Unspecified SameSiteMode .
Bu yeni değer, ile hiçbir sameSite gönderilmesi gerektiğini gösterir cookie .
Aralık düzeltme eki davranış değişiklikleri
.NET Framework ve .net Core 2,1 için belirli davranış değişikliği SameSite özelliğin değeri nasıl yorumlayacağını açıklamaktadır None . Düzeltme ekinin bir değeri " None hiçbir" özniteliği hiçbir "değil" olarak bir değere yaymadan önce, düzeltme ekinin ardından "özniteliği bir değeriyle göster" anlamına gelir None . Düzeltme ekiyle bir SameSite değeri, (SameSiteMode)(-1) özniteliğin yayınlanmasına neden olur.
Form kimlik doğrulaması ve oturum durumu için varsayılan SameSite değeri, ' cookie dan ' a değiştirilmiştir None Lax .
SameSite ile API kullanımı
HttpContext. Response. Cookie s. Append varsayılan olarak öğesine Unspecified eklenir, anlamı kendisine bir SameSite özniteliği eklenmez cookie ve istemciye varsayılan davranışını (eski tarayıcılarda olmayan) kullanması gerekir. Aşağıdaki kod, cookie SameSite değerinin nasıl değiştirileceğini göstermektedir SameSiteMode.Lax :
HttpContext.Response.Cookies.Append(
"name", "value",
new CookieOptions() { SameSite = SameSiteMode.Lax });
tüm ASP.NET Core bileşenleri cookie , önceki varsayılan değerleri, senaryoları için uygun ayarlarla geçersiz kılar. Geçersiz kılınan önceki varsayılan değerler değişmemiştir.
ASP.NET Core 3,1 ve üzeri, aşağıdaki samesite desteğini sağlamaktadır:
- ' Nin durumunu yayma davranışını tekrar tanımlar
SameSiteMode.None``SameSite=None SameSiteMode.UnspecifiedSameSite özniteliğini atlamak için yeni bir değer ekler.- Tüm cookie s API 'leri için varsayılan
Unspecified. S kullanan bazı bileşenler cookie , senaryolarına daha belirgin bir şekilde değer kümesi sağlar. Örnekler için yukarıdaki tabloya bakın.
ASP.NET Core 3,0 ' de ve sonraki sürümlerde, tutarsız istemci varsayılanlarıyla çakışmadan kaçınmak için samesite varsayılanları değiştirilmiştir. Aşağıdaki API 'Ler, SameSiteMode.Lax -1 Bu öğeleri Için bir SameSite özniteliği yaymamak üzere varsayılan olan ' i olarak değiştirmiştir cookie :
- CookieOptionsHttpContext. Response ile kullanılır. Cookie s. Append
- CookieBuilder için bir fabrika olarak kullanılır
CookieOptions - CookiePolicyOptions. MinimumSameSitePolicy
Geçmiş ve değişiklikler
samesite desteği ilk olarak 2016 taslak standardıkullanılarak 2,0 ' de ASP.NET Core uygulanmıştır. 2016 standardı kabul edildi. ASP.NET Core, varsayılan olarak birkaç tane olarak ayarlanarak kabul cookie edildi Lax . Kimlik doğrulaması ile ilgili birkaç sorunla karşılaşduktan sonra, en fazla site kullanımı devre dışı bırakıldı.
Kasım 2019 ' de 2016 standartdan 2019 standardına güncelleştirme için düzeltme ekleri yayınlandı. SameSite belirtiminin 2019 taslağı:
- , 2016 taslağı ile geriye dönük olarak uyumlu değildir . Daha fazla bilgi için bu belgede eski tarayıcıları destekleme bölümüne bakın.
- cookie, Varsayılan olarak olarak değerlendirilir
SameSite=Lax. - cookie
SameSite=NoneSiteler arası teslimin etkinleştirilmesi için açıkça onay veren öğeleri belirtirSecure.None, geri çevirmek için yeni bir giriştir. - ASP.NET Core 2,1, 2,2 ve 3,0 için verilen düzeltme ekleri tarafından desteklenir. ASP.NET Core 3,1, ek samesite desteğine sahiptir.
- , Şubat 2020' de varsayılan olarak Chrome tarafından etkinleştirilmek üzere zamanlanır. Tarayıcılar 2019 içinde bu standarda geçmeyi başlattı.
2016 SameSite taslak standartındaki değişiklikten etkilenen API 'Ler 2019 taslak standardına
- Http. SameSiteMode
- CookieOptions. SameSite
- CookieBuilder. SameSite
- CookiePolicyOptions. MinimumSameSitePolicy
- Microsoft.Net.Http.Headers.SameSiteMode
- Microsoft.Net.Http.Headers.SetCookieHeaderValue.SameSite
Eski tarayıcıları destekleme
2016 SameSite Standard uygulanan, bilinmeyen değerlerin değer olarak değerlendirilmelidir SameSite=Strict . 2016 SameSite standardını destekleyen eski tarayıcılardan erişilen uygulamalar, bir değeri olan bir SameSite özelliği edindiklerinde kesintiye uğramayabilir None . Web uygulamaları, eski tarayıcıları desteklemek istiyorlarsa, tarayıcı algılaması gerçekleştirmelidir. ASP.NET Core tarayıcı algılamayı uygulamaz çünkü User-Agents değerler yüksek ölçüde geçici ve sık sık değiştirilir. İçindeki bir uzantı noktası Microsoft.AspNetCore.CookiePolicy , belirli bir mantık User-Agent takmayı sağlar.
İçinde Startup.Configure , çağrılmadan önce çağıran kodu ekleyin UseCookiePolicy UseAuthentication veya şunu yazan herhangi bir yöntemi cookie :
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
else
{
app.UseExceptionHandler("/Error");
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();
app.UseCookiePolicy();
app.UseAuthentication();
app.UseAuthorization();
app.UseEndpoints(endpoints =>
{
endpoints.MapRazorPages();
});
}
' De Startup.ConfigureServices aşağıdakine benzer bir kod ekleyin:
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);
});
services.AddRazorPages();
}
private void CheckSameSite(HttpContext httpContext, CookieOptions options)
{
if (options.SameSite == SameSiteMode.None)
{
var userAgent = httpContext.Request.Headers["User-Agent"].ToString();
if (MyUserAgentDetectionLib.DisallowsSameSiteNone(userAgent))
{
options.SameSite = SameSiteMode.Unspecified;
}
}
}
public void ConfigureServices(IServiceCollection services)
{
services.Configure<CookiePolicyOptions>(options =>
{
options.MinimumSameSitePolicy = (SameSiteMode)(-1);
options.OnAppendCookie = cookieContext =>
CheckSameSite(cookieContext.Context, cookieContext.CookieOptions);
options.OnDeleteCookie = cookieContext =>
CheckSameSite(cookieContext.Context, cookieContext.CookieOptions);
});
services.AddRazorPages();
}
private void CheckSameSite(HttpContext httpContext, CookieOptions options)
{
if (options.SameSite == SameSiteMode.None)
{
var userAgent = httpContext.Request.Headers["User-Agent"].ToString();
if (MyUserAgentDetectionLib.DisallowsSameSiteNone(userAgent))
{
options.SameSite = (SameSiteMode)(-1);
}
}
}
Önceki örnekte, MyUserAgentDetectionLib.DisallowsSameSiteNone Kullanıcı aracısının SameSite 'yi desteklemeymediğini algılayan Kullanıcı tarafından sağlanan bir kitaplıktır None :
if (MyUserAgentDetectionLib.DisallowsSameSiteNone(userAgent))
{
options.SameSite = SameSiteMode.Unspecified;
}
Aşağıdaki kod örnek bir yöntemi gösterir DisallowsSameSiteNone :
Uyarı
Aşağıdaki kod yalnızca tanıtım amaçlıdır:
- Bu tam olarak kabul alınmamalıdır.
- Bakım veya destek sağlanmaz.
public static bool DisallowsSameSiteNone(string userAgent)
{
// Check if a null or empty string has been passed in, since this
// will cause further interrogation of the useragent to fail.
if (String.IsNullOrWhiteSpace(userAgent))
return false;
// 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;
}
SameSite sorunları için uygulamaları test edin
Üçüncü taraf oturum açma gibi uzak sitelerle etkileşime geçen uygulamaların şunları yapmanız gerekir:
- Etkileşimi birden çok tarayıcıda test edin.
- Bu belgede Cookie ele alan İlke tarayıcısı algılama ve azaltmayı uygulama.
Web uygulamalarını, yeni SameSite davranışını kabul ede bir istemci sürümü kullanarak test edin. Chrome, Firefox ve Chromium Edge'in tüm özellikleri test için kullanılmaktadır. Uygulamanıza SameSite düzeltme ekleri uygulandığında, özellikle safari olmak üzere daha eski istemci sürümleriyle test edin. Daha fazla bilgi için bu belgeye bakın. Eski tarayıcıları destekleme.
Chrome ile test
Chrome 78+ , geçici bir risk azaltması olduğu için yanıltıcı sonuçlar verir. Chrome 78+ geçici risk azaltma özelliği iki cookie dakikadan kısa bir süre önceye kadar devam ediyor. Uygun test bayraklarının etkin olduğu Chrome 76 veya 77, daha doğru sonuçlar sağlar. Yeni SameSite davranışını test etmek için chrome://flags/#same-site-by-default-cookies Etkin'e geçiş. Chrome'un eski sürümlerinin (75 ve altı) yeni ayarla başarısız olduğu None bildiriliyor. Bu belgede eski tarayıcıları destekleme'ye bakın.
Google, eski Chrome sürümlerinin kullanılabilir olmadığını gösterdi. Chrome'un eski sürümlerini test etmek Chromium İndirme yönergelerini izleyin. Chrome'un eski sürümlerini arayarak sağlanan bağlantılardan Chrome'u indirebilirsiniz.
Canary sürümünden başlayarak, sitelerin ve hizmetlerin risk azaltmanın kaldırıldığı özelliğin son son durumuyla test sınanmaya izin vermek amacıyla, lax+POST geçici azaltma özelliği yeni bayrağı kullanılarak test amacıyla devre dışı 80.0.3975.0 --enable-features=SameSiteDefaultChecksMethodRigorously bırakılabilir. Daha fazla bilgi için bkz. Chromium Projeleri SameSite Güncelleştirmeleri
Safari ile test
Safari 12, önceki taslağı sıkı bir şekilde uygulamaya verdi ve yeni değer None bir içinde olduğunda başarısız cookie oluyor. None , bu belgede eski tarayıcıları destekleyen tarayıcı algılama kodu aracılığıyla önlenmiş olur. MSAL, ADAL veya hangi kitaplığı kullanıyorsanız kullanın Safari 12, Safari 13 ve WebKit tabanlı işletim sistemi stili oturum açma bilgilerini test edin. Sorun, temel işletim sistemi sürümüne bağlıdır. OSX Mojave (10.14) ve iOS 12'nin yeni SameSite davranışıyla uyumluluk sorunları olduğu biliniyor. OSX Catalina (10.15) veya iOS 13 sürümüne yükseltilmesi sorunu düzeltir. Safari şu anda yeni özellik davranışını test etmek için bir kabul etme bayrağına sahip değildir.
Firefox ile test
Yeni standart için Firefox desteği sürüm 68+ üzerinde test edilebilir ve sayfada özellik about:config bayrağıyla kabul network.cookie.sameSite.laxByDefault edilir. Firefox'un eski sürümleriyle uyumluluk sorunlarıyla ilgili rapor yok.
Edge tarayıcısıyla test
Edge, eski SameSite standardını destekler. Edge sürüm 44'te yeni standartla ilgili bilinen bir uyumluluk sorunu yok.
Edge ile test (Chromium)
Sayfada SameSite bayrakları edge://flags/#same-site-by-default-cookies ayarlanır. Edge güvenlik sistemleriyle uyumluluk sorunu Chromium.
Ile test Electron
sürümleri, Electron uygulamanın eski sürümlerini Chromium. Örneğin, Teams Electron tarafından kullanılan Chromium 66'dır ve bu da daha eski davranışı sergiler. Kendi uyumluluk testlerinizi, ürün kullanımlarının sürümüyle Electron gerçekleştirmeniz gerekir. Aşağıdaki bölümde yer alan Eski tarayıcıları destekleme bölümüne bakın.