ASP.NET'de SameSite tanımlama bilgileriyle ç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:
- SameSite üst bilgisi olmayan tanımlama bilgileri varsayılan olarak olarak kabul
SameSite=Lax
edilir. SameSite=None
siteler arası tanımlama bilgisi kullanımına izin vermek için kullanılmalıdır.- Onaylayan
SameSite=None
tanımlama bilgileri de olarakSecure
işaretlenmelidir. - Kullanan
<iframe>
uygulamalar siteler arası senaryolar olarak kabul edildiğinden veyasameSite=Strict
tanımlama bilgileriylesameSite=Lax
<iframe>
ilgili sorunlarla karşılaşabilir. - Değere
SameSite=None
2016 standardı tarafından izin verilmez ve bazı uygulamaların bu tür tanımlama bilgilerini işlemesineSameSite=Strict
neden olur. Bu belgede eski tarayıcıları destekleme konusuna bakın.
Bu SameSite=Lax
ayar çoğu uygulama tanımlama bilgisinde çalışır. OpenID Connect (OIDC) ve WS-Federation gibi bazı kimlik doğrulama biçimleri varsayılan olarak POST tabanlı yeniden yönlendirmelerdir. 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.
Tanımlama bilgilerini yayan her ASP.NET bileşeninin SameSite'nin uygun olup olmadığını belirlemesi gerekir.
Bkz. 2019 .Net SameSite güncelleştirmelerini yükledikten sonra uygulamalarla ilgili sorunlar için bilinen sorunlar .
ASP.NET 4.7.2 ve 4.8'de SameSite Kullanma
.Net 4.7.2 ve 4.8, Aralık 2019'da güncelleştirmelerin yayımlanmasından bu yana SameSite için 2019 taslak standardını destekler. Geliştiriciler , HttpCookie.SameSite özelliğini kullanarak SameSite üst bilgisinin değerini program aracılığıyla denetleyebiliyor. özelliğinin SameSite
, Lax
veya None
olarak Strict
ayarlanması, bu değerlerin tanımlama bilgisi ile ağda yazılmasıyla sonuçlanıyor. değerine eşit (SameSiteMode)(-1)
olarak ayarlanması, tanımlama bilgisi ile ağa SameSite üst bilgisinin dahil edilmemesi gerektiğini gösterir. Yapılandırma dosyalarındaki HttpCookie.Secure Özelliği veya 'requireSSL' tanımlama bilgisini olarak Secure
işaretlemek için kullanılabilir.
Yeni HttpCookie
örnekler varsayılan olarak SameSite=(SameSiteMode)(-1)
ve Secure=false
olarak ayarlanır. Bu varsayılanlar yapılandırma bölümünde geçersiz kılınabilir system.web/httpCookies
; burada dize "Unspecified"
, için (SameSiteMode)(-1)
kolay bir yalnızca yapılandırma söz dizimidir:
<configuration>
<system.web>
<httpCookies sameSite="[Strict|Lax|None|Unspecified]" requireSSL="[true|false]" />
<system.web>
<configuration>
ASP.Net bu özellikler için kendi tanımlama bilgilerini de ASP.Net: Anonim Kimlik Doğrulaması, Forms Kimlik Doğrulaması, Oturum Durumu ve Rol Yönetimi. Çalışma zamanında elde edilen bu tanımlama bilgilerinin örnekleri, diğer HttpCookie örnekleri gibi ve Secure
özellikleri kullanılarak SameSite
işlenebilir. Ancak SameSite standardının düzeltme eki çalışması ortaya çıkması nedeniyle, bu dört özellik tanımlama bilgilerinin yapılandırma seçenekleri tutarsızdır. Varsayılanlarla ilgili yapılandırma bölümleri ve öznitelikleri aşağıda gösterilmiştir. Bir özellik için veya ilgili öznitelik yoksa SameSite
Secure
, özellik yukarıda açıklanan bölümde yapılandırılan system.web/httpCookies
varsayılanlara geri döner.
<configuration>
<system.web>
<anonymousIdentification cookieRequireSSL="false" /> <!-- No config attribute for SameSite -->
<authentication>
<forms cookieSameSite="Lax" requireSSL="false" />
</authentication>
<sessionState cookieSameSite="Lax" /> <!-- No config attribute for Secure -->
<roleManager cookieRequireSSL="false" /> <!-- No config attribute for SameSite -->
<system.web>
<configuration>
Not: 'Belirtilmemiş' yalnızca şu anda kullanılabilir system.web/httpCookies@sameSite
. Gelecekteki güncelleştirmelerde daha önce gösterilen cookieSameSite özniteliklerine benzer söz dizimi eklemeyi umuyoruz. Koddaki ayar (SameSiteMode)(-1)
bu tanımlama bilgilerinin örneklerinde çalışmaya devam eder.*
Bunu İngilizce dışında bir dilde okuyorsanız, kod açıklamalarını ana dilinizde görmek istiyorsanız bu GitHub tartışması sorununda bize bildirin.
.NET uygulamalarını yeniden hedefleme
.NET 4.7.2 veya sonraki bir sürümü hedeflemek için:
web.config aşağıdakileri içerdiğinden emin olun:
<system.web> <compilation targetFramework="4.7.2"/> <httpRuntime targetFramework="4.7.2"/> </system.web>
Proje dosyasının doğru TargetFrameworkVersion içerdiğini doğrulayın:
<TargetFrameworkVersion>v4.7.2</TargetFrameworkVersion>
.NET Geçiş Kılavuzu'nda daha fazla ayrıntı vardır.
Projedeki NuGet paketlerinin doğru çerçeve sürümüne hedeflendiğini doğrulayın. packages.config dosyasını inceleyerek doğru çerçeve sürümünü doğrulayabilirsiniz, örneğin:
<?xml version="1.0" encoding="utf-8"?> <packages> <package id="Microsoft.AspNet.Mvc" version="5.2.7" targetFramework="net472" /> <package id="Microsoft.ApplicationInsights" version="2.4.0" targetFramework="net451" /> </packages>
Önceki packages.config dosyasındaki
Microsoft.ApplicationInsights
paket:- .NET 4.5.1'e yöneliktir.
targetFramework
Çerçeve hedefinizi hedefleyen güncelleştirilmiş bir paket varsa özniteliğinin güncelleştirilmesinet472
gerekir.
4.7.2'den önceki .NET sürümleri
Microsoft, aynı site tanımlama bilgisi özniteliğini yazmak için 4.7.2'nin altındaki .NET sürümlerini desteklemez. Şu yol için güvenilir bir yol bulamadık:
- Özniteliğin tarayıcı sürümüne göre doğru yazılmasını sağlayın.
- Eski çerçeve sürümlerinde kimlik doğrulaması ve oturum tanımlama bilgilerini kesme ve ayarlama.
Aralık düzeltme eki davranışı değişiklikleri
.NET Framework için belirli bir davranış değişikliği, özelliğin SameSite
değeri nasıl yorumlayasıdırNone
:
- Düzeltme eki uygulamadan önce bir değerin
None
anlamı:- özniteliğini hiç yaymayın.
- Düzeltme ekinin ardından:
- değeri
None
"Özniteliği "değeriyleNone
yayma" anlamına gelir. SameSite
değeri(SameSiteMode)(-1)
özniteliğin yayılmamasıyla sonuçlanır.
- değeri
Form kimlik doğrulaması ve oturum durumu tanımlama bilgileri için varsayılan SameSite değeri olarak None
Lax
değiştirildi.
Tarayıcılar üzerindeki değişiklik etkisinin özeti
Düzeltme ekini yükler ve ile SameSite.None
bir tanımlama bilgisi yayınlarsanız iki işlemden biri gerçekleşir:
- Chrome v80 bu çerezi yeni uygulamaya göre ele alır ve tanımlama bilgisi üzerinde aynı site kısıtlamalarını uygulamaz.
- Yeni uygulamayı destekleyecek şekilde güncelleştirilmemiş tüm tarayıcılar eski uygulamayı izler. Eski uygulama şöyle diyor:
- Anlamadığınız bir değer görürseniz, bunu yoksayın ve katı aynı site kısıtlamalarına geçin.
Bu nedenle uygulama Chrome'da bozulur veya başka birçok yerde kırılırsınız.
Geçmiş ve değişiklikler
SameSite desteği ilk olarak 2016 taslak standardı kullanılarak .NET 4.7.2'de uygulandı.
Windows için 19 Kasım 2019 güncelleştirmeleri 2016 standardından 2019 standardına .NET 4.7.2+ güncelleştirildi. Diğer Windows sürümleri için ek güncelleştirmeler sunulacaktır. Daha fazla bilgi için .NET Framework'da SameSite'yi destekleyen KB makalelerine bakın.
SameSite belirtiminin 2019 taslağı:
- 2016 taslağı ile geriye dönük uyumlu değildir . Daha fazla bilgi için bu belgede eski tarayıcıları destekleme konusuna bakın.
- Tanımlama bilgilerinin varsayılan olarak kabul edilir olduğunu
SameSite=Lax
belirtir. - Siteler arası teslimi etkinleştirmek için açıkça onaylayan
SameSite=None
tanımlama bilgilerini belirtirSecure
. - Yukarıda listelenen KB'lerde açıklandığı gibi verilen düzeltme ekleri tarafından desteklenir.
- Şubat 2020'deChrome tarafından varsayılan olarak etkinleştirilmesi zamanlanmıştır. Tarayıcılar 2019'da bu standarda geçmeye başladı.
Bilinen Sorunlar
2016 ve 2019 taslak belirtimleri uyumlu olmadığından, Kasım 2019 .Net Framework güncelleştirmesi hataya neden olabilecek bazı değişiklikler içeriyor.
- Oturum Durumu ve Form Kimlik Doğrulaması tanımlama bilgileri artık belirtilmemiş olarak
Lax
değil ağa yazılır.- Çoğu uygulama tanımlama bilgileriyle
SameSite=Lax
çalışırken, siteler veya uygulamalar arasında POST'uniframe
kullandığı uygulamalar, oturum durumlarının veya form yetkilendirme tanımlama bilgilerinin beklendiği gibi kullanılmadığını fark edebilir. Bunu düzeltmek için, daha önce açıklandığı gibi uygun yapılandırma bölümündeki değeri değiştirincookieSameSite
.
- Çoğu uygulama tanımlama bilgileriyle
- Kod veya yapılandırmada açıkça ayarlanan
SameSite=None
HttpCookie'ler artık tanımlama bilgisi ile yazılmış bu değere sahipken, daha önce atlanmıştır. Bu, yalnızca 2016 taslak standardını destekleyen eski tarayıcılarda sorunlara neden olabilir.- Tanımlama bilgileriyle
SameSite=None
2019 taslak standardını destekleyen tarayıcıları hedeflerken, bunlarıSecure
işaretlemeyi unutmayın veya tanınmayabilirler. - yazmama
SameSite=None
2016 davranışına dönmek için uygulama ayarınıaspnet:SupressSameSiteNone=true
kullanın. Bunun uygulamadaki tüm HttpCookie'ler için geçerli olacağını unutmayın.
- Tanımlama bilgileriyle
Azure App Service—SameSite tanımlama bilgisi işleme
.Net 4.7.2 uygulamalarında Azure App Service SameSite davranışlarını yapılandırma hakkında bilgi için bkz. Azure App Service—SameSite tanımlama bilgisi işleme ve .NET Framework 4.7.2 düzeltme eki.
Eski tarayıcıları destekleme
2016 SameSite standardı, bilinmeyen değerlerin değer olarak SameSite=Strict
kabul edilmesi gerektiğini zorunlu olarak kabul etti. 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ılamayı uygulamalıdır. User-Agents değerleri son derece geçici olduğundan ve sık sık değiştiği için ASP.NET tarayıcı algılaması uygulamaz.
Microsoft'un sorunu çözme yaklaşımı, bir tarayıcının desteklemediği biliniyorsa özniteliği tanımlama bilgilerinden ayırmak sameSite=None
için tarayıcı algılama bileşenlerini uygulamanıza yardımcı olmaktır. Google'ın tavsiyesi, biri yeni öznitelikli, diğeri de özniteliği olmayan çift tanımlama bilgisi vermekti. Ancak Google'ın tavsiyesini sınırlı olarak değerlendiriyoruz. Bazı tarayıcıların, özellikle de mobil tarayıcıların, bir sitenin veya bir etki alanı adının gönderebileceği tanımlama bilgilerinin sayısı üzerinde çok küçük sınırları vardır. Birden çok tanımlama bilgisi, özellikle de kimlik doğrulama tanımlama bilgileri gibi büyük tanımlama bilgilerinin gönderilmesi mobil tarayıcı sınırına çok hızlı bir şekilde ulaşabilir ve tanılaması ve düzeltmesi zor olan uygulama hatalarına neden olabilir. Ayrıca bir çerçeve olarak, çift tanımlama bilgisi yaklaşımını kullanacak şekilde güncelleştirilmeyebilecek büyük bir üçüncü taraf kod ve bileşen ekosistemi vardır.
Bu GitHub deposundaki örnek projelerde kullanılan tarayıcı algılama kodu iki dosyada yer alır
Bu algılamalar, 2016 standardını destekleyen ve özniteliğin tamamen kaldırılması gereken en yaygın tarayıcı aracılarıdır. Tam bir uygulama olarak tasarlanmamıştır:
- Uygulamanız test sitelerimizin göremediği tarayıcıları görebilir.
- Ortamınız için gerekli algılamaları eklemeye hazırlıklı olmalısınız.
Algılamayı nasıl bağladığınız, kullandığınız .NET sürümüne ve web çerçevesine göre değişir. HttpCookie çağrı sitesinde aşağıdaki kod çağrılabilir:
private void CheckSameSite(HttpContext httpContext, HttpCookie cookie)
{
if (cookie.SameSite == SameSiteMode.None)
{
var userAgent = httpContext.Request.UserAgent;
if (BrowserDetection.DisallowsSameSiteNone(userAgent))
{
cookie.SameSite = (SameSiteMode)(-1);
}
}
}
Aşağıdaki ASP.NET 4.7.2 SameSite tanımlama bilgisi konularına bakın:
Sitenizin HTTPS'ye yeniden yönlendirilmesini sağlama
ASP.NET 4.x, WebForms ve MVC için IIS'nin URL Yeniden Yazma özelliği tüm istekleri HTTPS'ye yönlendirmek için kullanılabilir. Aşağıdaki XML örnek bir kuralı gösterir:
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<system.webServer>
<rewrite>
<rules>
<rule name="Redirect to https" stopProcessing="true">
<match url="(.*)"/>
<conditions>
<add input="{HTTPS}" pattern="Off"/>
<add input="{REQUEST_METHOD}" pattern="^get$|^head$" />
</conditions>
<action type="Redirect" url="https://{HTTP_HOST}/{R:1}" redirectType="Permanent"/>
</rule>
</rules>
</rewrite>
</system.webServer>
</configuration>
Iis URL'sinin şirket içi yüklemelerinde yeniden yazma , yüklenmesi gerekebilecek isteğe bağlı bir özelliktir.
SameSite sorunları için uygulamaları test etme
Uygulamanızı desteklediğiniz tarayıcılarla test etmeli ve tanımlama bilgileri içeren senaryolarınızı gözden geçirmelisiniz. Tanımlama bilgisi senaryoları genellikle
- Oturum açma formları
- Facebook, Azure AD, OAuth ve OIDC gibi dış oturum açma mekanizmaları
- Diğer sitelerden gelen istekleri kabul eden sayfalar
- Uygulamanızdaki sayfalar iframe'lere eklenecek şekilde tasarlanmıştır
Tanımlama bilgilerinin uygulamanızda doğru şekilde oluşturulup oluşturulmadığını, kalıcı hale geldiğini ve silindiğini denetlemeniz gerekir.
Üçü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.
- Bu belgede açıklanan tarayıcı 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ığında, bunu safari başta olmak üzere eski istemci sürümleriyle test edin. Daha fazla bilgi için bu belgedeki 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 süreli tanımlama bilgilerine izin verir. 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 olarak değiştirinchrome://flags/#same-site-by-default-cookies
. Chrome'un eski sürümlerinin (75 ve üzeri) yeni None
ayar ile başarısız olduğu bildirilir. Bu belgede eski tarayıcıları destekleme konusuna bakın.
Google, eski chrome sürümlerini kullanıma sunmuyor. Chrome'un eski sürümlerini test etmek için Chromium indirme başlığındaki yönergeleri izleyin. Chrome'un eski sürümlerini arayarak sağlanan bağlantılardan Chrome'ı indirmeyin .
- Chromium 76 Win64
- Chromium 74 Win64
- Windows'un 64 bit sürümünü kullanmıyorsanız, Chromium tarafından sağlanan yönergeleri kullanarak Chrome 74'e (v74.0.3729.108) karşılık gelen Chromium dalını aramak için Chromium Dash görüntüleyicisini kullanabilirsiniz.
Kanarya sürümünden 80.0.3975.0
başlayarak, Lax+POST geçici azaltma, azaltmanın kaldırıldığı özelliğin nihai 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
Chrome 80+ ile test edin
Chrome'un yeni özniteliğini destekleyen bir sürümünü indirin. Yazma sırasında geçerli sürüm Chrome 80'dir. Chrome 80'in yeni davranışı kullanabilmesi için bayrağının chrome://flags/#same-site-by-default-cookies
etkinleştirilmesi gerekir. Ayrıca, aynıSite özniteliği etkin olmayan tanımlama bilgileri için yaklaşan davranışı test etmek için (chrome://flags/#cookies-without-same-site-must-be-secure
) seçeneğini etkinleştirmeniz gerekir. Chrome 80, belirli istekler için zamanlanmış bir yetkisiz kullanım süresi olsa da tanımlama bilgilerini özniteliği SameSite=Lax
olmadan olarak işlemek üzere geçiş yapmak için hedeftedir. Zamanlanmış yetkisiz kullanım süresini devre dışı bırakmak için Chrome 80 aşağıdaki komut satırı bağımsız değişkeniyle başlatılabilir:
--enable-features=SameSiteDefaultChecksMethodRigorously
Chrome 80'in tarayıcı konsolunda aynıSite özniteliklerinin eksik olduğu konusunda uyarı iletileri var. Tarayıcı konsolunu açmak için F12'yi kullanın.
Safari ile test et
Safari 12 kesinlikle önceki taslağı uyguladı ve yeni None
değer bir tanımlama bilgisinde olduğunda başarısız oluyor. None
, bu belgede eski tarayıcıları destekleyen tarayıcı algılama kodu aracılığıyla engellenir. 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 sayfayı kabul ederek sürüm 68+ üzerinde about:config
test edilebilir. Firefox'un eski sürümleriyle ilgili uyumluluk sorunları bildirilmemiştir.
Edge (Eski) tarayıcı ile test edin
Edge, eski SameSite standardını destekler. Edge sürüm 44+'ın yeni standartla ilgili bilinen uyumluluk sorunları yoktur.
Edge ile test (Chromium)
Sayfada SameSite bayrakları ayarlanır edge://flags/#same-site-by-default-cookies
. Edge Chromium'da uyumluluk sorunu bulunmadı.
Elektron ile Test
Electron sürümleri Chromium eski sürümlerini içerir. Örneğin, Teams tarafından kullanılan Electron sürümü, eski davranışları sergileyen Chromium 66'dır. Ürününüzün kullandığı Electron sürümüyle kendi uyumluluk testinizi yapmalısınız. Bkz . Eski tarayıcıları destekleme.
SameSite düzeltme eklerini geri alma
.NET Framework uygulamalarındaki güncelleştirilmiş sameSite davranışını, sameSite özniteliğinin değeri için gösterilmediği önceki davranışına None
döndürebilir ve kimlik doğrulamasını ve oturum tanımlama bilgilerini değeri yaymayacak şekilde geri döndürebilirsiniz. Chrome değişiklikleri, standart değişiklikleri destekleyen tarayıcıları kullanan kullanıcılar için dış POST isteklerini veya kimlik doğrulamasını bozacağı için bu son derece geçici bir düzeltme olarak görülmelidir.
.NET 4.7.2 davranışını geri alma
web.config aşağıdaki yapılandırma ayarlarını içerecek şekilde güncelleştirin:
<configuration>
<appSettings>
<add key="aspnet:SuppressSameSiteNone" value="true" />
</appSettings>
<system.web>
<authentication>
<forms cookieSameSite="None" />
</authentication>
<sessionState cookieSameSite="None" />
</system.web>
</configuration>
Ek kaynaklar
- ASP.NET ve ASP.NET Core Yaklaşan SameSite Tanımlama Bilgisi Değişiklikleri
- SameSite'yi varsayılan olarak ve "SameSite=None; Güvenli" tanımlama bilgileri
- Chromium Blogu:Geliştiriciler: Yeni SameSite=None için Hazırlanın; Güvenli Tanımlama Bilgisi Ayarları
- SameSite tanımlama bilgileri açıklandı
- Chrome Güncelleştirmeler
- .NET SameSite Düzeltme Ekleri
- Azure Web Uygulamaları Aynı Site Bilgileri
- Azure ActiveDirectory Aynı Site Bilgileri