Если вы переходите на версию 3.1 .NET Core, ASP.NET Core или ASP.NET Core, критические изменения, перечисленные в этой статье, могут повлиять на работу приложения.
Для некоторых браузеров, таких как Chrome и Firefox, были внесены критические изменения в реализации SameSite для файлов cookie. Эти изменения негативно влияют на сценарии удаленной проверки подлинности, такие как OpenID Connect и WS-Federation, от которых нужно явно отказаться, отправив SameSite=None. Однако SameSite=None нарушает работу других браузеров в iOS 12 и некоторых более старых версий. Приложению требуется определить эти версии и опустить SameSite.
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.
Изменения в браузере и спецификации, описанные выше.
Рекомендуемое действие
Приложения, взаимодействующие с удаленными сайтами, например через стороннюю процедуру входа, должны:
тестировать эти сценарии в нескольких браузерах;
применить исправление определения браузеров в рамках политики файлов 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 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 следующий код:
C#
privatevoidCheckSameSite(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;
}
}
}
publicvoidConfigureServices(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);
});
}
publicvoidConfigure(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 в своем проекте:
Сборки времени разработки возвращают только ссылки на пакеты верхнего уровня
Начиная с пакета 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. Этот параметр включает предыдущее поведение, при котором создаются все элементы.
Начиная с .NET Core 3.1, некоторые элементы управления Windows Forms больше не доступны.
Описание изменения
Начиная с .NET Core 3.1, различные элементы управления Windows Forms больше не доступны. В .NET Framework 2.0 они были заменены элементами управления с улучшенной структурой и поддержкой. Нерекомендуемые элементы управления были ранее удалены из панелей элементов конструктора, но по-прежнему были доступны для использования.
При отображении подсказки не возникает событие 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 находится в режиме редактирования.
Источник этого содержимого можно найти на GitHub, где также можно создавать и просматривать проблемы и запросы на вытягивание. Дополнительные сведения см. в нашем руководстве для участников.
Отзыв о .NET
.NET — это проект с открытым исходным кодом. Выберите ссылку, чтобы оставить отзыв:
Создайте пользовательский интерфейс с привязкой данных. Пользовательский интерфейс автоматически обновляется на основе последних данных, а данные обновляются в ответ на изменения в пользовательском интерфейсе.