Aracılığıyla paylaş


ASP.NET Core 2.1 Razor Sayfaları SameSite cookie örneği

Bu örnek hedeflenen .NET Framework'leri hedefler

ASP.NET Core 2.1, SameSite özniteliği için yerleşik desteğe sahiptir, ancak özgün standarda yazılmıştır. Düzeltme eki uygulanmış davranış, değerini hiç yaymak yerine değeriyle NonesameSite özniteliğini yaymak için değerini SameSite.None değiştirdi. Değeri yaymak istemiyorsanız özelliğini cookie -1 olarak ayarlayabilirsinizSameSite.

ASP.NET Core, veya OpenIdConnect tümleştirme gibi IFrames gelişmiş senaryolar dışında SameSite tanımlama bilgilerinden 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 özniteliğini yazma

Aşağıdaki kod, bir üzerinde SameSite özniteliği cookieyazma örneğidir:

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 the SameSite property to (SameSiteMode)(-1).
    SameSite = SameSiteMode.None
};

// Add the cookie to the response cookie collection
Response.Cookies.Append(CookieName, "cookieValue", cookieOptions);

Cookie kimlik doğrulaması, oturum durumu ve diğer çeşitli bileşenler , seçenekler aracılığıyla Cookie aynıSite seçeneklerini ayarlar, örneğin

services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme)
    .AddCookie(options =>
    {
        options.Cookie.SameSite = SameSiteMode.None;
        options.Cookie.SecurePolicy = CookieSecurePolicy.Always;
        options.Cookie.IsEssential = true;
    });

services.AddSession(options =>
{
    options.Cookie.SameSite = SameSiteMode.None;
    options.Cookie.SecurePolicy = CookieSecurePolicy.Always;
    options.Cookie.IsEssential = true;
});

Önceki kodda, hem kimlik doğrulaması hem de cookie oturum durumu aynıSite özniteliğini Noneolarak ayarlar ve özniteliği bir None değerle yayar ve Secure özniteliğini olarak trueayarlar.

Örneği çalıştırma

Örnek projeyi çalıştırırsanız, tarayıcı hata ayıklayıcınızı ilk sayfaya yükleyin ve site koleksiyonunu cookie görüntülemek için kullanın. Edge ve Chrome'da bunu yapmak için sekmeye Application basın F12 ve bölümdeki seçeneğin altındaki site URL'sine Cookies Storage tıklayın.

Tarayıcı Hata Ayıklayıcısı Cookie Listesi

Yukarıdaki görüntüden, "SameSite CookieOluştur" düğmesine tıkladığınızda örnek tarafından oluşturulan öğesinin, örnek kodunda ayarlanan değerle eşleşen bir SameSite öznitelik değerine Laxsahip olduğunu cookie görebilirsiniz.

Tanımlama bilgilerini kesme

Tanımlama bilgilerini kesmek için, hiçbiri değerini kullanıcının tarayıcı aracısında desteğine göre ayarlamak için ara yazılımı kullanmanız CookiePolicy gerekir. Bu, içinde tanımlama bilgileri yazan ve yapılandırılan ConfigureServices()bileşenlerden önce http isteği işlem hattına yerleştirilmelidir.

İşlem hattına eklemek için Startup.cs yönteminde kullanın Configure(IApplicationBuilder, IHostingEnvironment) app.UseCookiePolicy(). Örneğin:

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
    if (env.IsDevelopment())
    {
       app.UseDeveloperExceptionPage();
    }
    else
    {
        app.UseExceptionHandler("/Home/Error");
        app.UseHsts();
    }

    app.UseHttpsRedirection();
    app.UseStaticFiles();
    app.UseCookiePolicy();
    app.UseAuthentication();
    app.UseSession();

    app.UseMvc(routes =>
    {
        routes.MapRoute(
            name: "default",
            template: "{controller=Home}/{action=Index}/{id?}");
    });
}

Ardından ilkeyi ConfigureServices(IServiceCollection services) cookie tanımlama bilgileri eklendiğinde veya silindiğinde yardımcı sınıfa çağrı yapmak üzere yapılandırın;

public void ConfigureServices(IServiceCollection services)
{
    services.Configure<CookiePolicyOptions>(options =>
    {
        options.CheckConsentNeeded = context => true;
        options.MinimumSameSitePolicy = SameSiteMode.None;
        options.OnAppendCookie = cookieContext =>
            CheckSameSite(cookieContext.Context, cookieContext.CookieOptions);
        options.OnDeleteCookie = cookieContext =>
            CheckSameSite(cookieContext.Context, cookieContext.CookieOptions);
    });
}

private void CheckSameSite(HttpContext httpContext, CookieOptions options)
{
    if (options.SameSite == SameSiteMode.None)
    {
        var userAgent = httpContext.Request.Headers["User-Agent"].ToString();
        if (SameSite.BrowserDetection.DisallowsSameSiteNone(userAgent))
        {
            options.SameSite = (SameSiteMode)(-1);
        }
    }
}

yardımcı işlevi CheckSameSite(HttpContext, CookieOptions):

  • tanımlama bilgileri isteğe eklendiğinde veya istekten silindiğinde çağrılır.
  • Özelliğin SameSite olarak ayarlandığını Nonedenetler.
  • olarak ayarlanırsa SameSite None ve geçerli kullanıcı aracısının yok öznitelik değerini desteklemediği bilinmektedir. Denetim, SameSiteSupport sınıfı kullanılarak yapılır:
    • özelliğini olarak ayarlayarak değeri yaymayacak şekilde ayarlar SameSite(SameSiteMode)(-1)

.NET Framework'ün hedeflenmesi

ASP.NET Core ve System.Web (ASP.NET 4.x), SameSite'nin bağımsız uygulamalarına sahiptir. .NET Framework için SameSite KB düzeltme ekleri, ASP.NET Core kullanılıyorsa gerekli değildir ve System.Web SameSite en düşük çerçeve sürümü gereksinimi (.NET Framework 4.7.2) ASP.NET Core için geçerli değildir.

.NET üzerinde ASP.NET Core, uygun düzeltmeleri almak için NuGet paket bağımlılıklarının güncelleştirilmesini gerektirir.

.NET Framework için ASP.NET Core değişikliklerini almak için, düzeltme eki uygulanmış paketlere ve sürümlere (2.1.14 veya üzeri 2.1 sürümleri) doğrudan başvuru aldığınızdan emin olun.

<PackageReference Include="Microsoft.Net.Http.Headers" Version="2.1.14" />
<PackageReference Include="Microsoft.AspNetCore.CookiePolicy" Version="2.1.14" />

Daha Fazla Bilgi

Chrome GüncelleştirmeleriASP.NET Core SameSite BelgeleriASP.NET Core 2.1 SameSite Değişiklik Duyurusu