Поделиться через


пример MVC SameSite cookie ASP.NET Core 2.1

ASP.NET Core 2.1 имеет встроенную поддержку атрибута SameSite , но он был записан в исходный стандарт. Исправленное поведение изменило значение SameSite.None того же атрибутаSite со значением None, а не выдавать значение вообще. Если вы хотите не выдавать значение, которое можно задать SameSite для свойства значение cookie -1.

ASP.NET Core Identity в значительной степени не влияет на тот же сайтcookie, за исключением расширенных сценариев, таких как IFrames или OpenIdConnect интеграция.

При использовании Identityне добавляйте cookie поставщиков и не вызывайте services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme)их. Identity

Написание атрибута SameSite

Ниже приведен пример записи атрибута SameSite в :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проверка подлинности, состояние сеанса и различные другие компоненты задают те же параметры сайта с помощью Cookie параметров, например

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

В приведенном выше коде cookie состояние проверки подлинности и сеанса задают для одного и того же атрибутаSite None, что и при создании атрибута со None значением, а также для атрибута Secure задано значение true.

Запуск примера

При запуске примера проекта загрузите отладчик браузера на начальную страницу и используйте его для просмотра cookie коллекции для сайта. Чтобы сделать это в Edge и Chrome, нажмите F12Application клавишу TAB и щелкните URL-адрес сайта в CookiesStorage разделе.

Browser Debugger Cookie List

На рисунке выше вы увидите, что cookie созданный примером при нажатии кнопки Create SameSite имеет значение Laxатрибута SameSiteCookie, соответствующее набору значений в примере кода.

cookieПерехват s

Чтобы перехватывать cookieзначения, не изменяйте значение в соответствии со своей поддержкой в агенте браузера пользователя, необходимо использовать CookiePolicy ПО промежуточного слоя. Это необходимо поместить в конвейер http-запроса, прежде чем все компоненты, которые записывают cookieи настроены внутри ConfigureServices().

Чтобы вставить его в конвейер, используемый app.UseCookiePolicy() в методе Configure(IApplicationBuilder, IHostingEnvironment)в Startup.cs. Например:

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

Затем в настройке ConfigureServices(IServiceCollection services)cookie политики для вызова вспомогательного класса при cookieдобавлении или удалении s. Например:

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

Вспомогательная функция CheckSameSite(HttpContext, CookieOptions):

  • Вызывается при cookieдобавлении s к запросу или удалении из запроса.
  • Проверяет, задано ли SameSite для Noneсвойства значение .
  • Если SameSite задано None значение и текущий агент пользователя не поддерживает значение атрибута none. Проверка выполняется с помощью класса SameSiteSupport:
    • Задает SameSite , чтобы не выдавать значение, задав для свойства значение . (SameSiteMode)(-1)

Назначение платформа .NET Framework

ASP.NET Core и System.Web (ASP.NET 4.x) имеют независимые реализации SameSite. Исправления SameSite КБ для платформа .NET Framework не требуются, если используется ASP.NET Core, а также требования к минимальной версии System.Web SameSite (платформа .NET Framework 4.7.2) применяются к ASP.NET Core.

ASP.NET Core в .NET требует обновления зависимостей пакета NuGet для получения соответствующих исправлений.

Чтобы получить изменения ASP.NET Core для платформа .NET Framework убедитесь, что у вас есть прямая ссылка на исправленные пакеты и версии (версии 2.1.14 или более поздней версии 2.1).

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

Дополнительные сведения

Обновления Chrome ASP.NET Документацияпо Core SameSite ASP.NET Core 2.1 SameSite Change Announcement