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 olarak Secureişaretlenmelidir.
  • Kullanan <iframe> uygulamalar, siteler arası senaryolar olarak ele alındığından <iframe> veya sameSite=Strictcookieile ilgili sorunlarla sameSite=Lax karşılaşabilir.
  • Değere SameSite=None 2016 standardı tarafından izin verilmez ve bazı uygulamaların gibi cookieSameSite=Strictdavranması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 Identityhiç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 SameSiteStrict, Laxveya 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 Unspecifiedkullanı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.Laxgö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.

Bileşen cookie Varsayılan
CookieBuilder SameSite Unspecified
Session SessionOptions.Cookie Lax
CookieTempDataProvider CookieTempDataProviderOptions.Cookie Lax
IAntiforgery AntiforgeryOptions.Cookie Strict
Cookie Kimlik doğrulama CookieAuthenticationOptions.Cookie Lax
AddTwitter TwitterOptions.StateCookie Lax
RemoteAuthenticationHandler<TOptions> RemoteAuthenticationOptions.CorrelationCookie None
AddOpenIdConnect OpenId Bağlan Options.NonceCookie None
HttpContext.Response.Cookies.Append CookieOptions Unspecified

ASP.NET Core 3.1 ve üzeri aşağıdaki SameSite desteğini sağlar:

  • Yayma davranışını SameSiteMode.None yeniden tanımlar SameSite=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:

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 olarak Secureiş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

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

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.0baş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.laxByDefaultile 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

Ö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 Unspecifiedkullanı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.Laxgö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.

Bileşen cookie Varsayılan
CookieBuilder SameSite Unspecified
Session SessionOptions.Cookie Lax
CookieTempDataProvider CookieTempDataProviderOptions.Cookie Lax
IAntiforgery AntiforgeryOptions.Cookie Strict
Cookie Kimlik doğrulama CookieAuthenticationOptions.Cookie Lax
AddTwitter TwitterOptions.StateCookie Lax
RemoteAuthenticationHandler<TOptions> RemoteAuthenticationOptions.CorrelationCookie None
AddOpenIdConnect OpenId Bağlan Options.NonceCookie None
HttpContext.Response.Cookies.Append CookieOptions Unspecified

ASP.NET Core 3.1 ve üzeri aşağıdaki SameSite desteğini sağlar:

  • Yayma davranışını SameSiteMode.None yeniden tanımlar SameSite=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:

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 olarak Secureiş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

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

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.0baş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.laxByDefaultile 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

Ö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 SameSiteNone . "Ö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 Noneyayma" 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 NoneLaxdeğiştirildi.

SameSite ile API kullanımı

HttpContext.Response.Cookies.Append varsayılan olarak Unspecifiedkullanı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.Laxgö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.

Bileşen cookie Varsayılan
CookieBuilder SameSite Unspecified
Session SessionOptions.Cookie Lax
CookieTempDataProvider CookieTempDataProviderOptions.Cookie Lax
IAntiforgery AntiforgeryOptions.Cookie Strict
Cookie Kimlik doğrulama CookieAuthenticationOptions.Cookie Lax
AddTwitter TwitterOptions.StateCookie Lax
RemoteAuthenticationHandler<TOptions> RemoteAuthenticationOptions.CorrelationCookie None
AddOpenIdConnect OpenId Bağlan Options.NonceCookie None
HttpContext.Response.Cookies.Append CookieOptions Unspecified

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 olarak Secureiş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

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

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.0baş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.laxByDefaultile 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

Ö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