ASP.NET Core'da SameSite'lerle cookieçalışma
Gönderen Rick Anderson
SameSite, siteler arası istek sahteciliği (CSRF) saldırılarına karşı koruma sağlamak için tasarlanmış bir IETF taslak standardıdır. İlk olarak 2016'da taslak olarak hazırlanan taslak standardı 2019'da güncelleştirildi. Güncelleştirilmiş standart, önceki standartla geriye dönük olarak uyumlu değildir ve en belirgin farklar şunlardır:
- Cookies, SameSite üst bilgisi olmadan varsayılan olarak olarak
SameSite=Lax
değerlendirilir. SameSite=None
siteler cookie arası kullanıma izin vermek için kullanılmalıdır.- Cookieonay da
SameSite=None
olarakSecure
işaretlenmelidir. - Kullanan
<iframe>
uygulamalar, siteler arası senaryolar olarak ele alındığından<iframe>
veyasameSite=Strict
cookieile ilgili sorunlarlasameSite=Lax
karşılaşabilir. - Değere
SameSite=None
2016 standardı tarafından izin verilmez ve bazı uygulamaların gibi cookieSameSite=Strict
davranmasına neden olur. Bu belgedeki Eski tarayıcıları destekleme konusuna bakın.
Bu SameSite=Lax
ayar çoğu uygulama cookieiçin çalışır. OpenID Bağlan (OIDC) ve WS-Federation gibi bazı kimlik doğrulama biçimleri post tabanlı yeniden yönlendirmeler olarak varsayılan olarak kullanılır. POST tabanlı yeniden yönlendirmeler SameSite tarayıcı korumalarını tetikler, bu nedenle SameSite bu bileşenler için devre dışı bırakılır. OAuth oturum açma bilgilerinin çoğu, isteğin akışındaki farklılıklardan etkilenmez.
s yayan cookieher ASP.NET Core bileşeninin SameSite'nin uygun olup olmadığını belirlemesi gerekir.
SameSite ve Identity
ASP.NET Core, veya OpenIdConnect
tümleştirme gibi IFrames
gelişmiş senaryolar dışında SameSite'lerden cookie büyük ölçüde etkilenmez.Identity
kullanırken Identity
hiçbir cookie sağlayıcı eklemeyin veya çağrısı services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme)
yapmayın, Identity
bu işlemle ilgilenir.
SameSite test örnek kodu
Aşağıdaki örnek indirilebilir ve test edilebilir:
Örnek | Belge |
---|---|
.NET Core Razor Sayfaları | ASP.NET Core 3.1 Razor Sayfaları SameSite cookie örneği |
sameSite özniteliği için .NET Core desteği
.NET Core, SameSite için 2019 taslak standardını destekler. Geliştiriciler özelliğini kullanarak HttpCookie.SameSite
aynıSite özniteliğinin değerini program aracılığıyla denetleyebiliyor. özelliğinin SameSite
Strict
, Lax
veya None
olarak ayarlanması, bu değerlerin ağ üzerinde ile yazılmasıyla cookiesonuçlanıyor. ayarı SameSiteMode.Unspecified
ile aynıSitenin gönderilmemesi cookiegerektiğini belirtir.
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.
SameSite = SameSiteMode.None
// The client should follow its default cookie policy.
// SameSite = SameSiteMode.Unspecified
};
// Add the cookie to the response cookie collection
Response.Cookies.Append("MyCookie", "cookieValue", cookieOptions);
}
SameSite ile API kullanımı
HttpContext.Response.Cookies.Append varsayılan olarak Unspecified
kullanılır; yani öğesine sameSite özniteliği eklenmez cookie ve istemci varsayılan davranışını kullanır (Yeni tarayıcılar için Lax, eskiler için Yok). Aşağıdaki kod, SameSite değerinin cookie olarak nasıl değiştireceğini SameSiteMode.Lax
gösterir:
HttpContext.Response.Cookies.Append(
"name", "value",
new CookieOptions() { SameSite = SameSiteMode.Lax });
s yayan cookietüm ASP.NET Core bileşenleri, önceki varsayılanları senaryolarına uygun ayarlarla geçersiz kılar. Önceki varsayılan değerler değiştirilmedi.
ASP.NET Core 3.1 ve üzeri aşağıdaki SameSite desteğini sağlar:
- Yayma davranışını
SameSiteMode.None
yeniden tanımlarSameSite=None
- SameSite özniteliğini atlamak için yeni bir değer
SameSiteMode.Unspecified
ekler. - Tüm cookieAPI'ler varsayılan olarak olarak kullanılır
Unspecified
. S kullanan bazı bileşenler cookie, senaryolarına daha özgü değerler ayarlar. Örnekler için yukarıdaki tabloya bakın.
ASP.NET Core 3.0 ve sonraki sürümlerinde SameSite varsayılanları, tutarsız istemci varsayılanlarıyla çakışmamak için değiştirildi. Aşağıdaki API'ler, bu cookieapi'ler için SameSite özniteliğini yaymamak için varsayılan SameSiteMode.Lax
-1
değeri olarak değiştirmiştir:
- CookieOptions HttpContext.Response ile kullanılır.Cookies.Append
- CookieBuilder için 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'da ASP.NET Core'da uygulandı. 2016 standardı kabul edildi. ASP.NET Core, varsayılan olarak birkaç cookies Lax
ayarını yaparak kabul etti. Kimlik doğrulamasıyla ilgili çeşitli sorunlarla karşılaşıldıktan sonra SameSite kullanımının çoğu devre dışı bırakıldı.
Yamalar Kasım 2019'da 2016 standardından 2019 standardına güncelleştirilmek üzere yayınlanmıştır. 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 konusuna bakın.
- S'lerin cookievarsayılan olarak olarak işleniyor olduğunu
SameSite=Lax
belirtir. - cookieSiteler arası teslimi etkinleştirmek için açıkça onaylayanların
SameSite=None
olarakSecure
işaretlenmesi gerektiğini belirtir.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 ve sonraki sürümleri ek SameSite desteğine sahiptir.
- Şub 2020'de Chrome tarafından varsayılan olarak etkinleştirilmesi zamanlanmıştır. Tarayıcılar 2019'da bu standarda geçmeye başladı.
2016 SameSite taslak standardından 2019 taslak standardına yapılan değişiklikten etkilenen API'ler
- 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ı, bilinmeyen değerlerin değer olarak SameSite=Strict
ele alınması gerektiğini zorunlu kılındı. 2016 SameSite standardını destekleyen eski tarayıcılardan erişilen uygulamalar, değerine None
sahip bir SameSite özelliği aldıklarında bozulabilir. Web uygulamaları, eski tarayıcıları desteklemeyi amaçlıyorsa tarayıcı algılaması uygulamalıdır. ASP.NET Core, Kullanıcı Aracıları değerleri son derece değişken olduğundan ve sık sık değiştiği için tarayıcı algılaması uygulamaz. içindeki Microsoft.AspNetCore.CookiePolicy bir uzantı noktası, User-Agent'a özgü mantığın takılmasına izin verir.
içindeProgram.cs
, çağırmadan UseAuthentication önce çağıran UseCookiePolicy kodu veya s yazan cookieherhangi bir yöntemi ekleyin:
var builder = WebApplication.CreateBuilder(args);
builder.Services.Configure<CookiePolicyOptions>(options =>
{
options.MinimumSameSitePolicy = SameSiteMode.Unspecified;
options.OnAppendCookie = cookieContext =>
CheckSameSite(cookieContext.Context, cookieContext.CookieOptions);
options.OnDeleteCookie = cookieContext =>
CheckSameSite(cookieContext.Context, cookieContext.CookieOptions);
});
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;
}
}
}
builder.Services.AddRazorPages();
var app = builder.Build();
if (!app.Environment.IsDevelopment())
{
app.UseExceptionHandler("/Error");
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();
app.UseCookiePolicy();
app.UseAuthorization();
app.MapRazorPages();
app.Run();
içinde Program.cs
, aşağıdaki vurgulanan koda benzer bir kod ekleyin:
var builder = WebApplication.CreateBuilder(args);
builder.Services.Configure<CookiePolicyOptions>(options =>
{
options.MinimumSameSitePolicy = SameSiteMode.Unspecified;
options.OnAppendCookie = cookieContext =>
CheckSameSite(cookieContext.Context, cookieContext.CookieOptions);
options.OnDeleteCookie = cookieContext =>
CheckSameSite(cookieContext.Context, cookieContext.CookieOptions);
});
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;
}
}
}
builder.Services.AddRazorPages();
var app = builder.Build();
if (!app.Environment.IsDevelopment())
{
app.UseExceptionHandler("/Error");
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();
app.UseCookiePolicy();
app.UseAuthorization();
app.MapRazorPages();
app.Run();
Yukarıdaki örnekte, MyUserAgentDetectionLib.DisallowsSameSiteNone
kullanıcı aracısının SameSite 'yi desteklemediğ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 kodda örnek DisallowsSameSiteNone
bir yöntem gösterilmektedir:
Uyarı
Aşağıdaki kod yalnızca tanıtım amaçlıdır:
- Tamamlanmış olarak kabul edilmemelidir.
- Bakım yapılmaz veya desteklenmez.
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 etme
Üçüncü taraf oturum açma bilgileri gibi uzak sitelerle etkileşim kuran uygulamaların şunlara ihtiyacı vardır:
- Etkileşimi birden çok tarayıcıda test edin.
- CookieBu belgede açıklanan İlke tarayıcısı algılama ve azaltmayı uygulayın.
Yeni SameSite davranışını kabul eden bir istemci sürümü kullanarak web uygulamalarını test edin. Chrome, Firefox ve Chromium Edge'in tümü test için kullanılabilecek yeni kabul etme özelliği bayraklarına sahiptir. Uygulamanız SameSite düzeltme eklerini uyguladıktan sonra, özellikle Safari olmak üzere eski istemci sürümleriyle test edin. Daha fazla bilgi için bu belgede eski tarayıcıları destekleme konusuna bakın.
Chrome ile test edin
Chrome 78+, geçici bir risk azaltmaya sahip olduğundan yanıltıcı sonuçlar verir. Chrome 78+ geçici azaltma özelliği, iki dakikadan kısa bir süre eskiye izin verir cookie. Uygun test bayraklarının etkinleştirildiği Chrome 76 veya 77, daha doğru sonuçlar sağlar. Yeni SameSite davranışını test etmek için Etkin'e geçinchrome://flags/#same-site-by-default-cookies
. Chrome'un eski sürümleri (75 ve üzeri) yeni None
ayarda başarısız olduğu bildirilir. Bu belgedeki Eski tarayıcıları destekleme konusuna bakın.
Google, eski chrome sürümlerini kullanıma sunmaz. Chrome'un eski sürümlerini test etmek için Chromium'u indirin başlığındaki yönergeleri izleyin. Chrome'un eski sürümlerini arayarak sağlanan bağlantılardan Chrome'ı indirmeyin.
Kanarya sürümünden 80.0.3975.0
başlayarak, Lax+POST geçici azaltma, azaltmanın kaldırıldığı özelliğin son son durumunda sitelerin ve hizmetlerin test edilmesine izin vermek için yeni bayrağı --enable-features=SameSiteDefaultChecksMethodRigorously
kullanılarak test amacıyla devre dışı bırakılabilir. Daha fazla bilgi için bkz. Chromium Projeleri SameSite Güncelleştirmeler
Safari ile test et
Safari 12, önceki taslağı kesin olarak uyguladı ve yeni None
değer içinde cookieolduğunda başarısız oluyor. None
, bu belgede eski tarayıcıları destekleyen tarayıcı algılama kodu aracılığıyla önlenir. MSAL, ADAL veya kullandığınız kitaplığı kullanarak 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 bilinmektedir. İşletim sistemini OSX Catalina (10.15) veya iOS 13'e yükseltmek sorunu düzeltir. Safari şu anda yeni belirtim davranışını test etmek için bir kabul etme bayrağına sahip değildir.
Firefox ile test edin
Yeni standart için Firefox desteği, özellik bayrağı network.cookie.sameSite.laxByDefault
ile sayfadan kabul edilerek about:config
sürüm 68+ üzerinde test edilebilir. Firefox'un eski sürümleriyle ilgili uyumluluk sorunları bildirilmemiştir.
Edge tarayıcısıyla test edin
Edge, eski SameSite standardını destekler. Edge sürüm 44'de yeni standartla ilgili bilinen bir uyumluluk sorunu yoktur.
Edge ile Test (Chromium)
Sayfada SameSite bayrakları ayarlanır edge://flags/#same-site-by-default-cookies
. Edge Chromium'da uyumluluk sorunu bulunamadı.
Ile test edin Electron
sürümleri Electron Chromium'un eski sürümlerini içerir. Örneğin, Teams tarafından kullanılan sürümü, eski davranışı gösteren Chromium 66 sürümüdür Electron . Ürününüzün kullandığı sürümle Electron kendi uyumluluk testinizi gerçekleştirmeniz gerekir. Aşağıdaki bölümde eski tarayıcıları destekleme bölümüne bakın.
Ek kaynaklar
- Chromium Blogu:Geliştiriciler: New SameSite=None için Hazırlanın; Güvenli Cookie Ayarlar
- SameSite cookieaçıklandı
- Kasım 2019 Yamaları
Örnek | Belge |
---|---|
.NET Core Razor Sayfaları | ASP.NET Core 3.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 Sayfaları SameSite cookie örneği |
sameSite özniteliği için .NET Core desteği
.NET Core 3.1 ve üzeri, SameSite için 2019 taslak standardını destekler. Geliştiriciler özelliğini kullanarak HttpCookie.SameSite
aynıSite özniteliğinin değerini program aracılığıyla denetleyebiliyor. özelliğini Strict SameSite
, Lax veya None olarak ayarlamak, bu değerlerin ağ üzerinde ile yazılmasıyla cookiesonuçlanıyor. değerine eşit (SameSiteMode)(-1)
olarak ayarlanması, ağdaki ile aynıSite özniteliğinin bulunmaması gerektiğini gösterir 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 numaralandırmaya SameSiteMode
fazladan bir sabit listesi değeri SameSiteMode.Unspecified
ekler.
Bu yeni değer, ile cookieaynıSitenin gönderilmemesi gerektiğini gösterir.
SameSite ile API kullanımı
HttpContext.Response.Cookies.Append varsayılan olarak Unspecified
kullanılır; yani öğesine sameSite özniteliği eklenmez cookie ve istemci varsayılan davranışını kullanır (Yeni tarayıcılar için Lax, eskiler için Yok). Aşağıdaki kod, SameSite değerinin cookie olarak nasıl değiştireceğini SameSiteMode.Lax
gösterir:
HttpContext.Response.Cookies.Append(
"name", "value",
new CookieOptions() { SameSite = SameSiteMode.Lax });
s yayan cookietüm ASP.NET Core bileşenleri, önceki varsayılanları senaryolarına uygun ayarlarla geçersiz kılar. Önceki varsayılan değerler değiştirilmedi.
ASP.NET Core 3.1 ve üzeri aşağıdaki SameSite desteğini sağlar:
- Yayma davranışını
SameSiteMode.None
yeniden tanımlarSameSite=None
- SameSite özniteliğini atlamak için yeni bir değer
SameSiteMode.Unspecified
ekler. - Tüm cookieAPI'ler varsayılan olarak olarak kullanılır
Unspecified
. S kullanan bazı bileşenler cookie, senaryolarına daha özgü değerler ayarlar. Örnekler için yukarıdaki tabloya bakın.
ASP.NET Core 3.0 ve sonraki sürümlerinde SameSite varsayılanları, tutarsız istemci varsayılanlarıyla çakışmamak için değiştirildi. Aşağıdaki API'ler, bu cookieapi'ler için SameSite özniteliğini yaymamak için varsayılan SameSiteMode.Lax
-1
değeri olarak değiştirmiştir:
- CookieOptions HttpContext.Response ile kullanılır.Cookies.Append
- CookieBuilder için 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'da ASP.NET Core'da uygulandı. 2016 standardı kabul edildi. ASP.NET Core, varsayılan olarak birkaç cookies Lax
ayarını yaparak kabul etti. Kimlik doğrulamasıyla ilgili çeşitli sorunlarla karşılaşıldıktan sonra SameSite kullanımının çoğu devre dışı bırakıldı.
Yamalar Kasım 2019'da 2016 standardından 2019 standardına güncelleştirilmek üzere yayınlanmıştır. 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 konusuna bakın.
- S'lerin cookievarsayılan olarak olarak işleniyor olduğunu
SameSite=Lax
belirtir. - cookieSiteler arası teslimi etkinleştirmek için açıkça onaylayanların
SameSite=None
olarakSecure
işaretlenmesi gerektiğini belirtir.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.
- Şub 2020'de Chrome tarafından varsayılan olarak etkinleştirilmesi zamanlanmıştır. Tarayıcılar 2019'da bu standarda geçmeye başladı.
2016 SameSite taslak standardından 2019 taslak standardına yapılan değişiklikten etkilenen API'ler
- 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ı, bilinmeyen değerlerin değer olarak SameSite=Strict
ele alınması gerektiğini zorunlu kılındı. 2016 SameSite standardını destekleyen eski tarayıcılardan erişilen uygulamalar, değerine None
sahip bir SameSite özelliği aldıklarında bozulabilir. Web uygulamaları, eski tarayıcıları desteklemeyi amaçlıyorsa tarayıcı algılaması uygulamalıdır. ASP.NET Core, Kullanıcı Aracıları değerleri son derece değişken olduğundan ve sık sık değiştiği için tarayıcı algılaması uygulamaz. içindeki Microsoft.AspNetCore.CookiePolicy bir uzantı noktası, User-Agent'a özgü mantığın takılmasına izin verir.
içindeStartup.Configure
, çağırmadan UseAuthentication önce çağıran UseCookiePolicy kodu veya s yazan cookieherhangi bir yöntemi ekleyin:
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();
});
}
içinde 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;
}
}
}
Yukarıdaki örnekte, MyUserAgentDetectionLib.DisallowsSameSiteNone
kullanıcı aracısının SameSite 'yi desteklemediğ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 kodda örnek DisallowsSameSiteNone
bir yöntem gösterilmektedir:
Uyarı
Aşağıdaki kod yalnızca tanıtım amaçlıdır:
- Tamamlanmış olarak kabul edilmemelidir.
- Bakım yapılmaz veya desteklenmez.
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 etme
Üçüncü taraf oturum açma bilgileri gibi uzak sitelerle etkileşim kuran uygulamaların şunlara ihtiyacı vardır:
- Etkileşimi birden çok tarayıcıda test edin.
- CookieBu belgede açıklanan İlke tarayıcısı algılama ve azaltmayı uygulayın.
Yeni SameSite davranışını kabul eden bir istemci sürümü kullanarak web uygulamalarını test edin. Chrome, Firefox ve Chromium Edge'in tümü test için kullanılabilecek yeni kabul etme özelliği bayraklarına sahiptir. Uygulamanız SameSite düzeltme eklerini uyguladıktan sonra, özellikle Safari olmak üzere eski istemci sürümleriyle test edin. Daha fazla bilgi için bu belgede eski tarayıcıları destekleme konusuna bakın.
Chrome ile test edin
Chrome 78+, geçici bir risk azaltmaya sahip olduğundan yanıltıcı sonuçlar verir. Chrome 78+ geçici azaltma özelliği, iki dakikadan kısa bir süre eskiye izin verir cookie. Uygun test bayraklarının etkinleştirildiği Chrome 76 veya 77, daha doğru sonuçlar sağlar. Yeni SameSite davranışını test etmek için Etkin'e geçinchrome://flags/#same-site-by-default-cookies
. Chrome'un eski sürümleri (75 ve üzeri) yeni None
ayarda başarısız olduğu bildirilir. Bu belgedeki Eski tarayıcıları destekleme konusuna bakın.
Google, eski chrome sürümlerini kullanıma sunmaz. Chrome'un eski sürümlerini test etmek için Chromium'u indirin başlığındaki yönergeleri izleyin. Chrome'un eski sürümlerini arayarak sağlanan bağlantılardan Chrome'ı indirmeyin.
Kanarya sürümünden 80.0.3975.0
başlayarak, Lax+POST geçici azaltma, azaltmanın kaldırıldığı özelliğin son son durumunda sitelerin ve hizmetlerin test edilmesine izin vermek için yeni bayrağı --enable-features=SameSiteDefaultChecksMethodRigorously
kullanılarak test amacıyla devre dışı bırakılabilir. Daha fazla bilgi için bkz. Chromium Projeleri SameSite Güncelleştirmeler
Safari ile test et
Safari 12, önceki taslağı kesin olarak uyguladı ve yeni None
değer içinde cookieolduğunda başarısız oluyor. None
, bu belgede eski tarayıcıları destekleyen tarayıcı algılama kodu aracılığıyla önlenir. MSAL, ADAL veya kullandığınız kitaplığı kullanarak 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 bilinmektedir. İşletim sistemini OSX Catalina (10.15) veya iOS 13'e yükseltmek sorunu düzeltir. Safari şu anda yeni belirtim davranışını test etmek için bir kabul etme bayrağına sahip değildir.
Firefox ile test edin
Yeni standart için Firefox desteği, özellik bayrağı network.cookie.sameSite.laxByDefault
ile sayfadan kabul edilerek about:config
sürüm 68+ üzerinde test edilebilir. Firefox'un eski sürümleriyle ilgili uyumluluk sorunları bildirilmemiştir.
Edge tarayıcısıyla test edin
Edge, eski SameSite standardını destekler. Edge sürüm 44'de yeni standartla ilgili bilinen bir uyumluluk sorunu yoktur.
Edge ile Test (Chromium)
Sayfada SameSite bayrakları ayarlanır edge://flags/#same-site-by-default-cookies
. Edge Chromium'da uyumluluk sorunu bulunamadı.
Ile test edin Electron
sürümleri Electron Chromium'un eski sürümlerini içerir. Örneğin, Teams tarafından kullanılan sürümü, eski davranışı gösteren Chromium 66 sürümüdür Electron . Ürününüzün kullandığı sürümle Electron kendi uyumluluk testinizi gerçekleştirmeniz gerekir. Aşağıdaki bölümde eski tarayıcıları destekleme bölümüne bakın.
Ek kaynaklar
- Chromium Blogu:Geliştiriciler: New SameSite=None için Hazırlanın; Güvenli Cookie Ayarlar
- SameSite cookieaçıklandı
- Kasım 2019 Yamaları
Örnek | Belge |
---|---|
.NET Core Razor Sayfaları | ASP.NET Core 3.1 Razor Sayfaları SameSite cookie örneği |
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 |
Aralık düzeltme eki davranışı değişiklikleri
.NET Framework ve .NET Core 2.1 için özel davranış değişikliği, özelliğin değeri nasıl yorumlayıp yorumlamasıdır SameSite
None
. "Özniteliği hiç yayma" anlamına gelen bir değeri None
düzeltme eki uygulamadan önce, düzeltme ekinin ardından "Özniteliği "değeriyle None
yayma" anlamına gelir. Düzeltme eki uygulandıktan sonra değeri SameSite
(SameSiteMode)(-1)
özniteliğin gösterilmemesiyle sonuçlanır.
Form kimlik doğrulaması ve oturum durumu cookieiçin varsayılan SameSite değeri olarak None
Lax
değiştirildi.
SameSite ile API kullanımı
HttpContext.Response.Cookies.Append varsayılan olarak Unspecified
kullanılır; yani öğesine sameSite özniteliği eklenmez cookie ve istemci varsayılan davranışını kullanır (Yeni tarayıcılar için Lax, eskiler için Yok). Aşağıdaki kod, SameSite değerinin cookie olarak nasıl değiştireceğini SameSiteMode.Lax
gösterir:
HttpContext.Response.Cookies.Append(
"name", "value",
new CookieOptions() { SameSite = SameSiteMode.Lax });
s yayan cookietüm ASP.NET Core bileşenleri, önceki varsayılanları senaryolarına uygun ayarlarla geçersiz kılar. Önceki varsayılan değerler değiştirilmedi.
Geçmiş ve değişiklikler
SameSite desteği ilk olarak 2016 taslak standardı kullanılarak 2.0'da ASP.NET Core'da uygulandı. 2016 standardı kabul edildi. ASP.NET Core, varsayılan olarak birkaç cookies Lax
ayarını yaparak kabul etti. Kimlik doğrulamasıyla ilgili çeşitli sorunlarla karşılaşıldıktan sonra SameSite kullanımının çoğu devre dışı bırakıldı.
Yamalar Kasım 2019'da 2016 standardından 2019 standardına güncelleştirilmek üzere yayınlanmıştır. 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 konusuna bakın.
- S'lerin cookievarsayılan olarak olarak işleniyor olduğunu
SameSite=Lax
belirtir. - cookieSiteler arası teslimi etkinleştirmek için açıkça onaylayanların
SameSite=None
olarakSecure
işaretlenmesi gerektiğini belirtir.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.
- Şub 2020'de Chrome tarafından varsayılan olarak etkinleştirilmesi zamanlanmıştır. Tarayıcılar 2019'da bu standarda geçmeye başladı.
2016 SameSite taslak standardından 2019 taslak standardına yapılan değişiklikten etkilenen API'ler
- 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ı, bilinmeyen değerlerin değer olarak SameSite=Strict
ele alınması gerektiğini zorunlu kılındı. 2016 SameSite standardını destekleyen eski tarayıcılardan erişilen uygulamalar, değerine None
sahip bir SameSite özelliği aldıklarında bozulabilir. Web uygulamaları, eski tarayıcıları desteklemeyi amaçlıyorsa tarayıcı algılaması uygulamalıdır. ASP.NET Core, Kullanıcı Aracıları değerleri son derece değişken olduğundan ve sık sık değiştiği için tarayıcı algılaması uygulamaz. içindeki Microsoft.AspNetCore.CookiePolicy bir uzantı noktası, User-Agent'a özgü mantığın takılmasına izin verir.
içindeStartup.Configure
, çağırmadan UseAuthentication önce çağıran UseCookiePolicy kodu veya s yazan cookieherhangi bir yöntemi ekleyin:
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();
});
}
içinde Startup.ConfigureServices
, aşağıdakine benzer bir kod ekleyin:
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);
}
}
}
Yukarıdaki örnekte, MyUserAgentDetectionLib.DisallowsSameSiteNone
kullanıcı aracısının SameSite 'yi desteklemediğ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 kodda örnek DisallowsSameSiteNone
bir yöntem gösterilmektedir:
Uyarı
Aşağıdaki kod yalnızca tanıtım amaçlıdır:
- Tamamlanmış olarak kabul edilmemelidir.
- Bakım yapılmaz veya desteklenmez.
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 etme
Üçüncü taraf oturum açma bilgileri gibi uzak sitelerle etkileşim kuran uygulamaların şunlara ihtiyacı vardır:
- Etkileşimi birden çok tarayıcıda test edin.
- CookieBu belgede açıklanan İlke tarayıcısı algılama ve azaltmayı uygulayın.
Yeni SameSite davranışını kabul eden bir istemci sürümü kullanarak web uygulamalarını test edin. Chrome, Firefox ve Chromium Edge'in tümü test için kullanılabilecek yeni kabul etme özelliği bayraklarına sahiptir. Uygulamanız SameSite düzeltme eklerini uyguladıktan sonra, özellikle Safari olmak üzere eski istemci sürümleriyle test edin. Daha fazla bilgi için bu belgede eski tarayıcıları destekleme konusuna bakın.
Chrome ile test edin
Chrome 78+, geçici bir risk azaltmaya sahip olduğundan yanıltıcı sonuçlar verir. Chrome 78+ geçici azaltma özelliği, iki dakikadan kısa bir süre eskiye izin verir cookie. Uygun test bayraklarının etkinleştirildiği Chrome 76 veya 77, daha doğru sonuçlar sağlar. Yeni SameSite davranışını test etmek için Etkin'e geçinchrome://flags/#same-site-by-default-cookies
. Chrome'un eski sürümleri (75 ve üzeri) yeni None
ayarda başarısız olduğu bildirilir. Bu belgedeki Eski tarayıcıları destekleme konusuna bakın.
Google, eski chrome sürümlerini kullanıma sunmaz. Chrome'un eski sürümlerini test etmek için Chromium'u indirin başlığındaki yönergeleri izleyin. Chrome'un eski sürümlerini arayarak sağlanan bağlantılardan Chrome'ı indirmeyin.
Kanarya sürümünden 80.0.3975.0
başlayarak, Lax+POST geçici azaltma, azaltmanın kaldırıldığı özelliğin son son durumunda sitelerin ve hizmetlerin test edilmesine izin vermek için yeni bayrağı --enable-features=SameSiteDefaultChecksMethodRigorously
kullanılarak test amacıyla devre dışı bırakılabilir. Daha fazla bilgi için bkz. Chromium Projeleri SameSite Güncelleştirmeler
Safari ile test et
Safari 12, önceki taslağı kesin olarak uyguladı ve yeni None
değer içinde cookieolduğunda başarısız oluyor. None
, bu belgede eski tarayıcıları destekleyen tarayıcı algılama kodu aracılığıyla önlenir. MSAL, ADAL veya kullandığınız kitaplığı kullanarak 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 bilinmektedir. İşletim sistemini OSX Catalina (10.15) veya iOS 13'e yükseltmek sorunu düzeltir. Safari şu anda yeni belirtim davranışını test etmek için bir kabul etme bayrağına sahip değildir.
Firefox ile test edin
Yeni standart için Firefox desteği, özellik bayrağı network.cookie.sameSite.laxByDefault
ile sayfadan kabul edilerek about:config
sürüm 68+ üzerinde test edilebilir. Firefox'un eski sürümleriyle ilgili uyumluluk sorunları bildirilmemiştir.
Edge tarayıcısıyla test edin
Edge, eski SameSite standardını destekler. Edge sürüm 44'de yeni standartla ilgili bilinen bir uyumluluk sorunu yoktur.
Edge ile Test (Chromium)
Sayfada SameSite bayrakları ayarlanır edge://flags/#same-site-by-default-cookies
. Edge Chromium'da uyumluluk sorunu bulunamadı.
Ile test edin Electron
sürümleri Electron Chromium'un eski sürümlerini içerir. Örneğin, Teams tarafından kullanılan sürümü, eski davranışı gösteren Chromium 66 sürümüdür Electron . Ürününüzün kullandığı sürümle Electron kendi uyumluluk testinizi gerçekleştirmeniz gerekir. Aşağıdaki bölümde eski tarayıcıları destekleme bölümüne bakın.
Ek kaynaklar
- Chromium Blogu:Geliştiriciler: New SameSite=None için Hazırlanın; Güvenli Cookie Ayarlar
- SameSite cookieaçıklandı
- Kasım 2019 Yamaları
Ö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 |
ASP.NET Core
Geri Bildirim
https://aka.ms/ContentUserFeedback.
Çok yakında: 2024 boyunca, içerik için geri bildirim mekanizması olarak GitHub Sorunları’nı kullanımdan kaldıracak ve yeni bir geri bildirim sistemiyle değiştireceğiz. Daha fazla bilgi için bkz.Gönderin ve geri bildirimi görüntüleyin