После добавления приведенной ниже конфигурации в 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.
Кажется, ваша проблема связана с конфигурацией защиты данных Learn.microsoft.com/en-us/aspnet/core/security/data-protection/…
Возникает ли такая же ошибка с Core 7? Core 8 по-прежнему глючит.
@JesúsLópez Как уже было сказано, я уже настроил пул приложений, но безрезультатно. Кроме того, ни одна из конфигураций, отличных от стандартных DataProtection
, похоже, не подходит для моего случая: простое веб-приложение, работающее на одном сервере iis; ни лазури, ни фермы.
Могу ли я понять вопрос так: мы добавили механизм сеанса в основное приложение asp.net, он работал хорошо локально, но после развертывания в IIS 8.5 на Win Server 2012 возникло исключение?
@TinyWang точно.
@jdweng К сожалению, я не могу это подтвердить.
См. следующее: stackoverflow.com/questions/40865011/…
@jdweng Хм, этот ответ stackoverflow.com/a/71924040/313935 выглядит интересно, хотя эта тема посвящена аутентификации (и именно поэтому я вообще ее пропустил). Тем не менее, я постараюсь присвоить файлу cookie сеанса собственное имя и вернуться к вам.
@jdweng stackoverflow.com/a/71924040/313935 вероятно, справился с задачей. Нужно проверить это немного дальше, но, похоже, теперь проблема решена. Спасибо.
После применения различных комбинаций конфигураций и тестирования я думаю, что должен ответить на свой вопрос.
Чтобы файлы cookie сеанса работали правильно для веб-приложения ASP.NET Core 8 MVC, размещенного в IIS 8.5 на Windows Server 20212 R2, убедитесь, что:
services.AddSession(options => {
...
options.Cookie.Name = ".yourApp.Session";
...
});
Надеюсь, поможет.
Попробуйте установить пользовательское удостоверение в пуле приложений (обычный пользователь) и установите для параметра «Загрузить профиль пользователя» значение true.