Файл cookie сеанса нельзя снять с защиты, когда веб-приложение ASP.NET Core 8.0 работает в IIS

После добавления приведенной ниже конфигурации в Startup.cs веб-приложения ASP.NET Core MVC, ориентированного на .NET 8.0:

services.AddSession(options =>
{
    options.IdleTimeout = TimeSpan.FromMinutes(50);
    options.Cookie.IsEssential = true;
    options.Cookie.HttpOnly = true;                
    options.Cookie.SameSite = SameSiteMode.Strict;
});

...

app.UseSession();

сотни таких предупреждений регистрируются приложением, развернутым на сервере IIS 8.5 (Windows Server 2012 R2):

https://example.com/Login: Ошибка при снятии защиты с файла cookie сеанса.

Регистратор: Microsoft.AspNetCore.Session.SessionMiddleware

Место вызова: Microsoft.AspNetCore.Session.CookieProtection.Unprotect

Исключение: System.Security.Cryptography.CryptographicException: ключ {x-y-z} не найден в связке ключей. Для получения дополнительной информации перейдите на https://aka.ms/aspnet/dataprotectionwarning на Microsoft.AspNetCore.DataProtection.KeyManagement.KeyRingBasedDataProtector.UnprotectCore(Byte[] protectedData, логическое значениеallowOperationsOnRevokedKeys, UnprotectStatus& статус) в Microsoft.AspNetCore.Session.CookieProtection.Unprotect(IDataProtector защитник, String protectedText, регистратор ILogger)

Session используется только для хранения списка объявлений, которые будут показаны пользователю после входа в систему:

[HttpPost]
public async Task<IActionResult> Login(...)
{
   ...
   await announcementService.BuildAnnouncementsFor(user);
   ...
}

В конечном итоге BuildAnnoucementsFor сохраняет список объявлений (т. е. строк) для сеанса с помощью IHttpContextAccessor.HttpContext.Session, который настраивается следующим образом:

services.AddHttpContextAccessor();

services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();

Я уже настроил загрузку профиля пользователя в конфигурации IIS , поскольку DataProtection, похоже, связана с проблемой, и когда пул приложений был (пере)запущен, также было зарегистрировано следующее предупреждение:

Ни профиль пользователя, ни реестр HKLM недоступны. Использование эфемерного хранилище ключей. Защищенные данные будут недоступны, когда приложение выходит.

В приведенном выше последнем предупреждении исчезло, но SessionMiddleware по-прежнему предупреждает о том, что ключ шифрования не найден в связке ключей. Действительно, ключи, указанные в предупреждениях, по умолчанию не находятся в папке C:\ProgramData\Microsoft\Crypto\RSA\MachineKeys, , где IIS ищет ключи .

Мне бы очень хотелось, чтобы эти предупреждения исчезли, но я не знаю, что еще нужно настроить — в коде или в IIS.

Попробуйте установить пользовательское удостоверение в пуле приложений (обычный пользователь) и установите для параметра «Загрузить профиль пользователя» значение true.

Jesús López 22.06.2024 13:23

Кажется, ваша проблема связана с конфигурацией защиты данных Learn.microsoft.com/en-us/aspnet/core/security/data-protecti‌​on/…

Jesús López 22.06.2024 13:26

Возникает ли такая же ошибка с Core 7? Core 8 по-прежнему глючит.

jdweng 22.06.2024 17:14

@JesúsLópez Как уже было сказано, я уже настроил пул приложений, но безрезультатно. Кроме того, ни одна из конфигураций, отличных от стандартных DataProtection, похоже, не подходит для моего случая: простое веб-приложение, работающее на одном сервере iis; ни лазури, ни фермы.

dpant 22.06.2024 17:38

Могу ли я понять вопрос так: мы добавили механизм сеанса в основное приложение asp.net, он работал хорошо локально, но после развертывания в IIS 8.5 на Win Server 2012 возникло исключение?

Tiny Wang 24.06.2024 04:16

@TinyWang точно.

dpant 24.06.2024 11:18

@jdweng К сожалению, я не могу это подтвердить.

dpant 24.06.2024 11:19

См. следующее: stackoverflow.com/questions/40865011/…

jdweng 24.06.2024 11:22

@jdweng Хм, этот ответ stackoverflow.com/a/71924040/313935 выглядит интересно, хотя эта тема посвящена аутентификации (и именно поэтому я вообще ее пропустил). Тем не менее, я постараюсь присвоить файлу cookie сеанса собственное имя и вернуться к вам.

dpant 24.06.2024 14:17

@jdweng stackoverflow.com/a/71924040/313935 вероятно, справился с задачей. Нужно проверить это немного дальше, но, похоже, теперь проблема решена. Спасибо.

dpant 26.06.2024 11:20
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
10
125
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

Чтобы файлы cookie сеанса работали правильно для веб-приложения ASP.NET Core 8 MVC, размещенного в IIS 8.5 на Windows Server 20212 R2, убедитесь, что:

  • В конфигурации IIS для свойства «Загрузить профиль пользователя» установлено значение true. Как настроить описано в этом ответе.
  • Файл cookie сеанса имеет уникальное имя, чтобы избежать конфликта с остальными веб-приложениями, размещенными на том же сервере, что является безопасным предположением. Как его настроить описано в этом ответе, но для краткости позвольте мне упомянуть об этом и здесь:
services.AddSession(options => {
  ...
  options.Cookie.Name = ".yourApp.Session";
  ...
});

Надеюсь, поможет.

Другие вопросы по теме