Udostępnij za pośrednictwem


przykład ASP.NET Core 2.1 MVC SameSite cookie

ASP.NET Core 2.1 ma wbudowaną obsługę atrybutu SameSite , ale został zapisany w oryginalnym standardzie. Zachowanie poprawione zmieniło znaczenie SameSite.None emisji tego samego atrybutu lokacji z wartością None, a nie emitować wartości w ogóle. Jeśli nie chcesz emitować wartości, możesz ustawić SameSite właściwość na cookie -1.

ASP.NET Core Identity nie ma wpływu na pliki cookie SameSite, z wyjątkiem zaawansowanych scenariuszy, takich jak IFrames lub OpenIdConnect integracji.

W przypadku korzystania z programu Identitynie należy dodawać żadnych cookie dostawców ani dzwonić services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme)do usługi , Identity dba o to.

Pisanie atrybutu SameSite

Poniżej przedstawiono przykład sposobu pisania atrybutu SameSite w obiekcie 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)(-1).
    SameSite = SameSiteMode.None
};

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

Cookie uwierzytelnianie, stan sesji i różne inne składniki ustawiają te same opcje witryny za pośrednictwem Cookie opcji, na przykład

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;
});

W poprzednim kodzie zarówno cookie stan uwierzytelniania, jak i sesji ustawił ich ten sam atrybutWitryna na None, emitując atrybut z wartością None , a także ustaw atrybut Secure na true.

Uruchamianie aplikacji przykładowej

Jeśli uruchomisz przykładowy projekt, załaduj debuger przeglądarki na początkowej stronie i użyj go do wyświetlenia cookie zbioru dla witryny. W tym celu w przeglądarce Microsoft Edge i Chrome naciśnij F12 , a następnie wybierz Application kartę i kliknij adres URL witryny w Cookies obszarze opcji w Storage sekcji .

Lista debugera Cookie przeglądarki

Na powyższym obrazie widać, że cookie utworzony przez przykład po kliknięciu przycisku "Utwórz to samowitrynę" ma wartość atrybutu LaxSameSite Cookiez wartością , odpowiadającą wartości ustawionej w przykładowym kodzie.

Przechwytywanie plików cookie

Aby przechwycić pliki cookie, aby dostosować wartość none zgodnie z jego obsługą w agencie przeglądarki użytkownika, należy użyć oprogramowania pośredniczącego CookiePolicy . Należy to umieścić w potoku żądania HTTP przed wszystkimi składnikami, które zapisują pliki cookie i konfigurowane w programie ConfigureServices().

Aby wstawić go do potoku, użyj app.UseCookiePolicy() metody w Configure(IApplicationBuilder, IHostingEnvironment) Startup.cs. Na przykład:

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?}");
    });
}

Następnie w ConfigureServices(IServiceCollection services) konfiguracji cookie zasad w celu wywołania klasy pomocniczej po dołączeniu lub usunięciu plików cookie. Na przykład:

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);
        }
    }
}

Funkcja CheckSameSite(HttpContext, CookieOptions)pomocnika :

  • Jest wywoływany, gdy pliki cookie są dołączane do żądania lub usuwane z żądania.
  • Sprawdza, czy właściwość jest ustawiona SameSite na None.
  • Jeśli SameSite jest ustawiona None wartość i bieżący agent użytkownika jest znany, aby nie obsługiwać wartości atrybutu none. Sprawdzanie odbywa się przy użyciu klasy SameSiteSupport :
    • Ustawia SameSite wartość , aby nie emitować wartości, ustawiając właściwość na (SameSiteMode)(-1)

Określanie platformy .NET Framework

ASP.NET Core i System.Web (ASP.NET 4.x) mają niezależne implementacje witryny SameSite. Poprawki bazy wiedzy SameSite dla programu .NET Framework nie są wymagane, jeśli używasz platformy ASP.NET Core ani nie jest wymagane minimalne wymaganie dotyczące platformy System.Web SameSite (.NET Framework 4.7.2) ma zastosowanie do platformy ASP.NET Core.

ASP.NET Core na platformie .NET wymaga zaktualizowania zależności pakietów NuGet w celu uzyskania odpowiednich poprawek.

Aby uzyskać zmiany ASP.NET Core dla programu .NET Framework, upewnij się, że masz bezpośrednie odwołanie do poprawek pakietów i wersji (wersja 2.1.14 lub nowsza 2.1).

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

Więcej informacji

Aktualizacjeprogramu Chrome ASP.NET core sameSite documentationASP.NET Core 2.1 SameSite Change Anons