Критические изменения в .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.1System.Web
(для .NET Framework 4.7.2 и более поздних версий)
Категория
ASP.NET
Затронутые API
- Microsoft.AspNetCore.Builder.CookiePolicyOptions.MinimumSameSitePolicy
- Microsoft.AspNetCore.Http.CookieBuilder.SameSite
- Microsoft.AspNetCore.Http.CookieOptions.SameSite
- Microsoft.AspNetCore.Http.SameSiteMode
- Microsoft.Net.Http.Headers.SameSiteMode
- Microsoft.Net.Http.Headers.SetCookieHeaderValue.SameSite
Развертывание
Путь к 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 они были заменены элементами управления с улучшенной структурой и поддержкой. Нерекомендуемые элементы управления были ранее удалены из панелей элементов конструктора, но по-прежнему были доступны для использования.
Следующие типы больше не доступны.
- ContextMenu
- DataGrid
- DataGrid.HitTestType
- DataGrid.HitTestInfo
- DataGridBoolColumn
- DataGridCell
- DataGridColumnStyle
- DataGridColumnStyle.DataGridColumnHeaderAccessibleObject
- DataGridColumnStyle.CompModSwitches
- DataGridLineStyle
- DataGridParentRowsLabelStyle
- DataGridPreferredColumnWidthTypeConverter
- DataGridTableStyle
- DataGridTextBox
- DataGridTextBoxColumn
- GridColumnStylesCollection
- GridTablesFactory
- GridTableStylesCollection
- IDataGridEditingService
- IMenuEditorService
- MainMenu
- Menu
- Menu.MenuItemCollection
- MenuItem
- ToolBar
- ToolBarAppearance
- ToolBarButton
- ToolBar.ToolBarButtonCollection
- ToolBarButtonClickEventArgs
- ToolBarButtonStyle
- ToolBarTextAlign
Представленные версии
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
- System.Windows.Forms.ContextMenu
- System.Windows.Forms.GridColumnStylesCollection
- System.Windows.Forms.GridTablesFactory
- System.Windows.Forms.GridTableStylesCollection
- System.Windows.Forms.IDataGridEditingService
- System.Windows.Forms.MainMenu
- System.Windows.Forms.Menu
- System.Windows.Forms.Menu.MenuItemCollection
- System.Windows.Forms.MenuItem
- System.Windows.Forms.ToolBar
- System.Windows.Forms.ToolBar.ToolBarButtonCollection
- System.Windows.Forms.ToolBarAppearance
- System.Windows.Forms.ToolBarButton
- System.Windows.Forms.ToolBarButtonClickEventArgs
- System.Windows.Forms.ToolBarButtonStyle
- System.Windows.Forms.ToolBarTextAlign
- System.Windows.Forms.DataGrid
- System.Windows.Forms.DataGrid.HitTestType
- System.Windows.Forms.DataGridBoolColumn
- System.Windows.Forms.DataGridCell
- System.Windows.Forms.DataGridColumnStyle
- System.Windows.Forms.DataGridLineStyle
- System.Windows.Forms.DataGridParentRowsLabelStyle
- System.Windows.Forms.DataGridPreferredColumnWidthTypeConverter
- System.Windows.Forms.DataGridTableStyle
- System.Windows.Forms.DataGridTextBox
- System.Windows.Forms.DataGridTextBoxColumn
- System.Windows.Forms.Design.IMenuEditorService
При отображении подсказки не возникает событие 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
нет