AspNet Core использует репозиторий в памяти для защиты данных при работе в IIS

Я использую производственный сервер (Windows Server 2012) с веб-сайтом AspNet Mvc Core RC1.

В логах наблюдаю следующее:

Neither user profile nor HKLM registry available. Using an ephemeral key repository. Protected data will be unavailable when application exits.

Изучив исходный код DataProtection, я отследил проблему до следующего вызова метода:

Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData)

Вероятно, по какой-то причине сервер возвращает null. У меня нет специальной пользовательской конфигурации, и я прочитал документы поэтому я думал, что по умолчанию будет работать.

Я думаю, проблема в том, что веб-сайт IIS не работает в контексте определенного пользователя, но я понятия не имею, как это подтвердить или исправить. Мой сайт настроен на собственный пул.

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


person mrahhal    schedule 08.05.2016    source источник
comment
Удостоверение вашего приложения настроено на загрузку профиля пользователя?   -  person TGlatzer    schedule 11.05.2016
comment
@TGlatzer Я думаю, что проблема в этом (помимо контейнеров). Я попробую промахнуться с ним, когда у меня будет доступ к серверу.   -  person mrahhal    schedule 11.05.2016


Ответы (4)


Профиль пользователя должен быть загружен в конфигурацию IIS.

Откройте IIS, щелкните правой кнопкой мыши «Пулы приложений», затем «Дополнительные параметры». И установите для параметра «Загрузить профиль пользователя» значение true. Перезапустите приложение, и оно должно работать отлично.

person mrahhal    schedule 11.05.2016
comment
В моем IIS уже установлено значение true, что не исправляет эту ошибку для меня... - person Anatolii Humennyi; 05.05.2017
comment
Но... почему??? Это только сейчас стало происходить? Что-то изменилось? Я не понимаю. - person Piotr Kula; 29.12.2017

Ключи защиты данных, используемые приложениями ASP.NET, хранятся в кустах реестра, внешних по отношению к приложениям. При запуске вашего приложения в качестве идентификатора AppPool вам необходимо создать куст реестра для каждого AppPool, используемого с приложением ASP.NET Core.

Для автономных установок IIS можно использовать оболочку PowerShell для защиты данных. script для каждого пула приложений, используемого с приложением ASP.NET Core. Ключи будут сохранены в реестре.

Как ясно указано в журналах, поскольку раздел реестра, который ищет Data Protection, не существует, ключи не будут сохраняться на диске. Вместо этого они будут эфемерными и будут жить только в памяти.

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

См. официальный документ ASP.NET Core о защите данных для получения дополнительной информации

person Sourabh Shirhatti    schedule 16.05.2016
comment
Это правильный ответ, в основном вам нужно указать IIS, где хранить ключ, чтобы он мог повторно получать доступ между сеансами. Только что ответил на аналогичный вопрос «Можно ли сохранять файлы cookie между сеансами отладки Visual Studio»> stackoverflow.com/questions/46225867/ - person Nathan Zaetta; 10.10.2017
comment
Является ли это проблемой, если вы просто работаете на машине разработчика? - person niico; 23.09.2018

Те, кто находится в размещенной среде, где права доступа очень ограничены, могут использовать PersistKeysToFileSystem. Добавление следующего списка в Startup.cs решит вашу проблему:

public void ConfigureServices(IServiceCollection services)
{
    services.AddDataProtection()
    .PersistKeysToFileSystem(new DirectoryInfo(@"\\server\share\directory\"));
}

Вы можете изменить строку пути в соответствии с вашими потребностями. Также проверьте ProtectKeysWith, если вы хотите настроить систему для защиты ключей в состоянии покоя, вызвав любой из API конфигурации ProtectKeysWith*.

person vahid    schedule 19.05.2019

Взгляните на это из репозитория DataProtection Git

Короче говоря, в IIS есть ошибка, которая, возможно, никогда не будет исправлена ​​и которая мешает правильной настройке реестра для ключей DataProtection. Существует сценарий powershell для правильной ручной настройки реестра, поэтому что это работает для AspNet Core. После запуска сценария для каждого пула приложений, который вы используете для приложений AspNet Core, эти приложения будут работать должным образом.

person Yepeekai    schedule 19.01.2018
comment
Что еще я могу сделать, если я нахожусь в размещенной среде, где права доступа очень ограничены. Я не могу ни запустить скрипт powershell, ни изменить настройки пула приложений? - person kliszaq; 10.02.2018
comment
Вы попали в сложную ситуацию... Я думаю, вам следует проверить, возможно ли найти кого-то, кто имеет доступ для этого. Как правило, вы должны быть в состоянии найти кого-то/процедуру для изменения конфигурации сервера, когда это оправдано некоторой бумажной работой. Удачи! - person Yepeekai; 10.02.2018