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


Пример файла cookie SameSite для ASP.NET 4.7.2 C# WebForms

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

Запись атрибута SameSite

Ниже приведен пример записи атрибута SameSite в файл cookie.

// Create the cookie
HttpCookie sameSiteCookie = new HttpCookie("SameSiteSample");

// Set a value for the cookie
sameSiteCookie.Value = "sample";

// Set the secure flag, which Chrome's changes will require for SameSite none.
// Note this will also require you to be running on HTTPS
sameSiteCookie.Secure = true;

// Set the cookie to HTTP only which is good practice unless you really do need
// to access it client side in scripts.
sameSiteCookie.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 -1.
sameSiteCookie.SameSite = SameSiteMode.None;

// Add the cookie to the response cookie collection
Response.Cookies.Add(sameSiteCookie);

Если вы читаете это на языке, отличном от английского, сообщите нам об этом в этой проблеме обсуждения GitHub , если вы хотите видеть комментарии к коду на своем родном языке.

Атрибут sameSite по умолчанию для файла cookie проверки подлинности на основе форм задается в cookieSameSite параметре параметров проверки подлинности на основе форм в web.config

<system.web>
  <authentication mode="Forms">
    <forms name=".ASPXAUTH" loginUrl="~/" cookieSameSite="None" requireSSL="true">
    </forms>
  </authentication>
</system.web>

Атрибут sameSite по умолчанию для состояния сеанса также задается в параметре cookieSameSite параметров сеанса в web.config

<system.web>
  <sessionState cookieSameSite="None">     
  </sessionState>
</system.web>

Обновление за ноябрь 2019 г. для .NET изменило параметры по умолчанию для проверки подлинности с помощью форм и сеанса на lax наиболее совместимый параметр, однако если вы внедряете страницы в iframes, может потребоваться отменить изменения этот параметр на Нет, а затем добавить код перехвата, показанный ниже, чтобы настроить none поведение в зависимости от возможностей браузера.

Выполнение примера

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

Список файлов cookie отладчика браузера

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

Перехват файлов cookie, которые вы не контролируете

В .NET 4.5.2 появилось новое событие для перехвата записи заголовков. Response.AddOnSendingHeaders Это можно использовать для перехвата файлов cookie перед их возвратом на клиентский компьютер. В примере мы связаем событие со статическим методом, который проверяет, поддерживает ли браузер новые изменения sameSite, и, если нет, изменяет файлы cookie, чтобы не выдавать атрибут, если новое None значение было задано.

Пример подключения события см . в файле global.asax , а в файле SameSiteCookieRewriter.cs — пример обработки события и настройки атрибута cookie sameSite .

public static void FilterSameSiteNoneForIncompatibleUserAgents(object sender)
{
    HttpApplication application = sender as HttpApplication;
    if (application != null)
    {
        var userAgent = application.Context.Request.UserAgent;
        if (SameSite.BrowserDetection.DisallowsSameSiteNone(userAgent))
        {
            HttpContext.Current.Response.AddOnSendingHeaders(context =>
            {
                var cookies = context.Response.Cookies;
                for (var i = 0; i < cookies.Count; i++)
                {
                    var cookie = cookies[i];
                    if (cookie.SameSite == SameSiteMode.None)
                    {
                        cookie.SameSite = (SameSiteMode)(-1); // Unspecified
                    }
                }
            });
        }
    }
}

Вы можете изменить определенное поведение именованных файлов cookie практически таким же образом; Приведенный ниже пример настраивает файл cookie проверки подлинности по умолчанию с Lax на None в браузерах, поддерживающих None значение , или удаляет атрибут sameSite в браузерах, которые не поддерживают None.

public static void AdjustSpecificCookieSettings()
{
    HttpContext.Current.Response.AddOnSendingHeaders(context =>
    {
        var cookies = context.Response.Cookies;
        for (var i = 0; i < cookies.Count; i++)
        {
            var cookie = cookies[i]; 
            // Forms auth: ".ASPXAUTH"
            // Session: "ASP.NET_SessionId"
            if (string.Equals(".ASPXAUTH", cookie.Name, StringComparison.Ordinal))
            { 
                if (SameSite.BrowserDetection.DisallowsSameSiteNone(userAgent))
                {
                    cookie.SameSite = -1;
                }
                else
                {
                    cookie.SameSite = SameSiteMode.None;
                }
                cookie.Secure = true;
            }
        }
    });
}

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

Обновления Chrome

Документация по ASP.NET

Исправления .NET SameSite