Критические изменения в .NET Core 3.1

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

ASP.NET Core

HTTP: Браузер SameSite изменяет проверку подлинности

Для некоторых браузеров, таких как Chrome и Firefox, были внесены критические изменения в реализации SameSite для файлов cookie. Эти изменения негативно влияют на сценарии удаленной проверки подлинности, такие как OpenID Connect и WS-Federation, от которых нужно явно отказаться, отправив SameSite=None. Однако SameSite=None нарушает работу других браузеров в iOS 12 и некоторых более старых версий. Приложению требуется определить эти версии и опустить SameSite.

Обсуждение этого вопроса см. на странице dotnet/aspnetcore#14996.

Представленные версии

3.1 (предварительная версия 1)

Старое поведение

SameSite является расширением проекта стандарта за 2016 год для файлов cookie в HTTP. Этот атрибут предназначен для устранения подделки межсайтовых запросов (CSRF). Изначально этот атрибут был спроектирован в виде функции, с которой серверы должны были явно соглашаться, добавляя новые параметры. В ASP.NET Core 2.0 была добавлена начальная поддержка для SameSite.

Новое поведение

Компания Google предложила новый проект стандарта, не имеющий обратной совместимости. Этот стандарт изменяет режим по умолчанию на Lax и добавляет новую запись None для явного отказа. Lax подходит для файлов cookie большинства приложений, однако нарушает работу межсайтовых сценариев, таких как вход с использованием WS-Federation и OpenID Connect. Основную часть процедур входа OAuth это не затрагивает из-за различий в последовательностях обработки запросов. Новый параметр None вызывает проблемы совместимости для клиентов, в которых реализован предыдущий проект стандарта (например, iOS 12). Эти изменения будут включены в Chrome 80. Сведения о сроках выпуска продукта Chrome см. в новостях по SameSite.

Продукт ASP.NET Core 3.1 был обновлен, чтобы реализовать новое поведение SameSite. Это обновление переопределяет поведение SameSiteMode.None для выдачи SameSite=None и добавляет новое значение SameSiteMode.Unspecified, чтобы опустить атрибут SameSite. Все API файлов cookie теперь по умолчанию используют Unspecified, хотя некоторые компоненты, использующие файлы cookie, задают более конкретные значения для соответствующих сценариев, таких как корреляция OpenID Connect и файлы cookie nonce.

Сведения о последних переменах в этой области см. в разделе HTTP. Некоторые значения по умолчанию параметра SameSite для файлов cookie изменены на None. В ASP.NET Core 3.0 большинство значений по умолчанию изменились с SameSiteMode.Lax на SameSiteMode.None (однако по-прежнему используется более ранний стандарт).

Причина изменения

Изменения в браузере и спецификации, описанные выше.

Приложения, взаимодействующие с удаленными сайтами, например через стороннюю процедуру входа, должны:

  • тестировать эти сценарии в нескольких браузерах;
  • применить исправление определения браузеров в рамках политики файлов cookie, описанное в разделе Поддержка более старых браузеров.

Инструкции по тестированию и определению браузеров см. в следующем разделе:

Определение того, затрагивают ли вас эти изменения

Протестируйте свое веб-приложение с использованием версии клиента, которая может явно согласиться на новое поведение. В Chrome, Firefox и Microsoft Edge Chromium предусмотрены флаги функции явного согласия, которые можно использовать для тестирования. Убедитесь, что ваше приложение совместимо с более старыми версиями клиента после установки исправлений, что особенно актуально для Safari. Дополнительные сведения см. в разделе Поддержка более старых браузеров.

Chrome

Chrome 78 и более поздних версий дает неверные результаты тестирования. Эти версии используют временные меры исправления и позволяют использовать файлы cookie, имеющие возраст менее двух минут. При включении соответствующих флагов тестирования Chrome 76 и 77 дают более точные результаты. Чтобы проверить новое поведение, включите chrome://flags/#same-site-by-default-cookies. Для Chrome 75 и более ранних версий новый параметр None вызывает ошибку. Дополнительные сведения см. в разделе Поддержка более старых браузеров.

Google не предоставляет более старые версии Chrome. Однако можно скачать более старые версии Chromium, которых достаточно для тестирования. Следуйте указаниям на странице скачивания Chromium.

Safari

В Safari 12 строго реализован предыдущий проект стандарта, поэтому этот браузер завершается со сбоем, если встречает новое значение None в файлах cookie. Такой сценарий следует исключить с помощью кода определения браузеров, приведенного в разделе Поддержка более старых браузеров. Обязательно проведите тестирование Safari 12 и 13, а также процедур входа на основе WebKit и механизмов ОС с использованием Библиотеки проверки подлинности Майкрософт (MSAL), Библиотеки проверки подлинности Active Directory (ADAL) или любой другой библиотеки. Эта проблема зависит от базовой версии ОС. Известно, что в OSX Mojave 10.14 и iOS 12 имеются проблемы совместимости с этим новым поведением. Обновление до OSX Catalina 10.15 или iOS 13 позволяет устранить их. Сейчас в Safari нет флага явного согласия для тестирования поведения, описанного в новой спецификации.

Firefox

Поддержку нового стандарта для Firefox можно проверить в версии 68 и более поздних, указав явное согласие на странице about:config с помощью флага компонента network.cookie.sameSite.laxByDefault. Сведения о проблемах совместимости для более ранних версий Firefox отсутствуют.

Microsoft Edge

Хотя Microsoft Edge поддерживает старый стандарт SameSite, начиная с версии 44, в нем нет никаких проблем совместимости с новым стандартом.

Microsoft Edge Chromium

Используется флаг компонента edge://flags/#same-site-by-default-cookies. При тестировании в Microsoft Chromium 78 никакие проблемы совместимости не наблюдались.

Electron

Версии Electron включают в себя более старые версии Chromium. Например, в Microsoft Teams используется версия Electron — Chromium 66, в которой реализовано старое поведение. Выполните собственное тестирование совместимости для версии Electron, используемой вашим продуктом. Дополнительные сведения см. в разделе Поддержка более старых браузеров.

Поддержка более старых браузеров

Стандарт SameSite за 2016 год предписывает обрабатывать неизвестные значения как значения SameSite=Strict. Следовательно, все старые браузеры, поддерживающие оригинальный стандарт, могут прекращать работу, встретив свойство SameSite со значением None. Если требуется поддерживать эти старые браузеры, веб-приложения должны реализовать определение браузеров. ASP.NET Core не реализует определение браузеров, так как значения заголовков запросов User-Agent крайне непостоянны и меняются каждую неделю. Вместо этого точка расширения в политике файлов cookie позволяет добавить логику, связанную с User-Agent.

Добавьте в файл Startup.cs следующий код:

private void CheckSameSite(HttpContext httpContext, CookieOptions options)
{
    if (options.SameSite == SameSiteMode.None)
    {
        var userAgent = httpContext.Request.Headers["User-Agent"].ToString();
        // TODO: Use your User Agent library of choice here.
        if (/* UserAgent doesn't support new behavior */)
        {
            options.SameSite = SameSiteMode.Unspecified;
        }
    }
}

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

public void Configure(IApplicationBuilder app)
{
    // Before UseAuthentication or anything else that writes cookies.
    app.UseCookiePolicy();

    app.UseAuthentication();
    // code omitted for brevity
}
Параметры явного отказа

Параметр совместимости Microsoft.AspNetCore.SuppressSameSiteNone позволяет временно явно отказаться от нового поведения файлов cookie ASP.NET Core. Добавьте следующий код JSON в файл runtimeconfig.template.json в своем проекте:

{
  "configProperties": {
    "Microsoft.AspNetCore.SuppressSameSiteNone": "true"
  }
}
Другие версии

Подготавливаются к выпуску соответствующие исправления SameSite для следующих продуктов:

  • ASP.NET Core 2.1, 2.2 и 3.0
  • Microsoft.Owin 4.1
  • System.Web (для .NET Framework 4.7.2 и более поздних версий)

Категория

ASP.NET

Затронутые API


Развертывание

Путь к 64-разрядному узлу x86 в Windows

MSBuild

Сборки времени разработки возвращают только ссылки на пакеты верхнего уровня

Начиная с пакета SDK для .NET Core 3.1.400 целевой RunResolvePackageDependencies возвращает только ссылки на пакеты верхнего уровня.

Представленные версии

Пакет SDK для .NET Core 3.1.400

Описание изменения

В предыдущих версиях пакета SDK для .NET Core целевой объект RunResolvePackageDependencies создавал следующие элементы MSBuild, которые содержали информацию из файла ресурсов NuGet:

  • PackageDefinitions
  • PackageDependencies
  • TargetDefinitions
  • FileDefinitions
  • FileDependencies

Эти данные используются в Visual Studio для заполнения узла зависимостей в обозревателе решений. Однако объем данных может быть большим, и эти данные не нужны, если узел зависимости не развернут.

Начиная с пакета SDK для .NET Core версии 3.1.400 большинство этих элементов не создается по умолчанию. Возвращаются только элементы типа Package. Если Visual Studio требуются элементы для заполнения узла зависимостей, он считывает информацию непосредственно из файла ресурсов.

Причина изменения

Это было введено для улучшения производительности при загрузке решения в Visual Studio. Ранее загружались все ссылки на пакеты, что приводило к загрузке множества ссылок, которые большинство пользователей никогда не увидят.

Если логика MSBuild зависит от создаваемых элементов, задайте для свойства EmitLegacyAssetsFileItems в файле проекта значение true. Этот параметр включает предыдущее поведение, при котором создаются все элементы.

Категория

MSBuild

Затронутые API

Н/П


SDK

Манифесты инструментов в корневой папке

Windows Forms

Удаленные элементы управления

Начиная с .NET Core 3.1, некоторые элементы управления Windows Forms больше не доступны.

Описание изменения

Начиная с .NET Core 3.1, различные элементы управления Windows Forms больше не доступны. В .NET Framework 2.0 они были заменены элементами управления с улучшенной структурой и поддержкой. Нерекомендуемые элементы управления были ранее удалены из панелей элементов конструктора, но по-прежнему были доступны для использования.

Следующие типы больше не доступны.

Представленные версии

3.1

Каждый удаленный элемент управления имеет рекомендуемую замену. См. таблицу ниже.

Удаленный элемент управления (API) Рекомендуемая замена Связанные удаленные интерфейсы API
ContextMenu ContextMenuStrip
DataGrid DataGridView DataGridCell, DataGridRow, DataGridTableCollection, DataGridColumnCollection, DataGridTableStyle, DataGridColumnStyle, DataGridLineStyle, DataGridParentRowsLabel, DataGridParentRowsLabelStyle, DataGridBoolColumn, DataGridTextBox, GridColumnStylesCollection, GridTableStylesCollection, HitTestType
MainMenu MenuStrip
Меню ToolStripDropDown, ToolStripDropDownMenu MenuItemCollection
MenuItem ToolStripMenuItem
ToolBar ToolStrip ToolBarAppearance
ToolBarButton ToolStripButton ToolBarButtonClickEventArgs, ToolBarButtonClickEventHandler, ToolBarButtonStyle, ToolBarTextAlign

Категория

Windows Forms

Затронутые API


При отображении подсказки не возникает событие CellFormatting

DataGridView теперь отображает всплывающие подсказки для ошибок и текста в ячейке при наведении указателя мыши и при выборе с помощью клавиатуры. Если подсказка отображается, событие DataGridView.CellFormatting не возникает.

Описание изменения

До .NET Core 3.1 DataGridView, у которого для свойства ShowCellToolTips было задано значение true, отображал подсказку для ошибок и текста в ячейке при наведении указателя мыши на эту ячейку. Подсказки не отображались при выборе ячейки с помощью клавиатуры (например, с помощью клавиши TAB, сочетаний клавиш или клавиш со стрелками). Если пользователь изменил ячейку, а затем, пока DataGridView находился в режиме редактирования, навел указатель на ячейку, для которой не задано свойство ToolTipText, возникало событие CellFormatting для форматирования текста ячейки, отображаемого в ней.

Чтобы удовлетворить требованиям стандартов специальных возможностей, начиная с .NET Core 3.1, DataGridView, у которого для свойства ShowCellToolTips задано значение true, отображает подсказки для ошибок и текста ячейки не только при наведении указателя мыши, но и при выборе ячейки с помощью клавиатуры. Как следствие этого изменения событие CellFormattingне возникает, когда указатель наводится на ячейки, для которых не задано свойство ToolTipText, пока DataGridView находится в режиме редактирования. Событие не возникает, так как содержимое ячейки, на которую наведен указатель, выводится в виде подсказки, а не отображается в ячейке.

Представленные версии

3.1

Выполните рефакторинг всего кода, зависящего от события CellFormatting, когда DataGridView находится в режиме редактирования.

Категория

Windows Forms

Затронутые API

нет


См. также