Aracılığıyla paylaş


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

ASP.NET Core 3.0,SameSite özniteliği için yerleşik desteğe sahiptir ve özniteliğin yazıldığını gizlemeye yönelik bir SameSiteMode öznitelik değeri Unspecified de içerir.

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 özniteliğini yazma

Aşağıda, bir üzerinde SameSite özniteliği yazma örneği verilmiştir 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 the SameSite property to SameSiteMode.Unspecified.
    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;
});

Hem kimlik doğrulaması hem de cookie oturum durumu yukarıda gösterilen kodda sameSite özniteliğini Yok olarak ayarlayın, özniteliği bir None değerle yayın ve secure özniteliğini true olarak ayarlayın.

Ö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 CookiesStorage tıklayın.

Browser Debugger Cookie List

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.

Kesişenler cookie

S'lere müdahale cookieetmek için, kullanıcının tarayıcı aracısında desteğine göre hiçbiri değerini ayarlamak için ara yazılımı kullanmanız CookiePolicy gerekir. Bu, içinde ConfigureServices()s yazan cookieve yapılandırılan bileşenlerden önce http isteği işlem hattına yerleştirilmelidir.

İşlem hattına eklemek için Startup.cs'nizdeki yönteminde kullanın app.UseCookiePolicy()Configure(IApplicationBuilder, IHostingEnvironment). Ö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) yapılandırarak cookie eklendiğinde veya silindiğinde cookiebir yardımcı sınıfa çağrı yapı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.Unspecified;
        }
    }
}

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

  • İstek sonuna eklendiğinde veya istekten silindiğinde cookieçağrılır.
  • Özelliğin SameSite olarak ayarlandığını Nonedenetler.
  • olarak ayarlanırsa SameSiteNone 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)

Ek Bilgi

Chrome Güncelleştirmeler ASP.NET Core SameSite Belgeleri