Aracılığıyla paylaş


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 olarak Secureişaretlenmelidir.
  • Kullanan <iframe> uygulamalar siteler arası senaryolar olarak kabul edildiğinden veya sameSite=Strict tanımlama bilgileriyle sameSite=Lax<iframe> ilgili sorunlarla karşılaşabilir.
  • Değere SameSite=None2016 standardı tarafından izin verilmez ve bazı uygulamaların bu tür tanımlama bilgilerini işlemesine SameSite=Strictneden 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 , Laxveya None olarak Strictayarlanması, 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=falseolarak 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 SameSiteSecure , ö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ştirilmesi net472 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ğeriyle Noneyayma" anlamına gelir.
    • SameSite değeri (SameSiteMode)(-1) özniteliğin yayılmamasıyla sonuçlanır.

Form kimlik doğrulaması ve oturum durumu tanımlama bilgileri için varsayılan SameSite değeri olarak NoneLaxdeğiştirildi.

Tarayıcılar üzerindeki değişiklik etkisinin özeti

Düzeltme ekini yükler ve ile SameSite.Nonebir 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 belirtir Secure.
  • 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'un iframe 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ştirin cookieSameSite .
  • 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=None2016 davranışına dönmek için uygulama ayarını aspnet:SupressSameSiteNone=truekullanın. Bunun uygulamadaki tüm HttpCookie'ler için geçerli olacağını unutmayın.

.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 Nonesahip 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:

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 .

Kanarya sürümünden 80.0.3975.0baş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=Laxolmadan 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.laxByDefaultile 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 Nonedö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