Что именно происходит, когда я устанавливаю LoadUserProfile пула IIS?

У меня возникла следующая проблема.

Я запускаю следующий код

var binaryData = File.ReadAllBytes(pathToPfxFile);
var cert = new X509Certificate2(binaryData, password);

в двух процессах. Один из процессов работает под LOCAL_SYSTEM, и этот код преуспевает. Другой работает внутри IIS под локальной учетной записью пользователя, принадлежащей локальной группе "Пользователи", и я получаю следующее исключение:

System.Security.Cryptography.CryptographicException
Object was not found.
at System.Security.Cryptography.CryptographicException.ThrowCryptographicException(Int32 hr)
at System.Security.Cryptography.X509Certificates.X509Utils._LoadCertFromBlob(Byte[] rawData, IntPtr password, UInt32 dwFlags, Boolean persistKeySet, SafeCertContextHandle& pCertCtx)
at System.Security.Cryptography.X509Certificates.X509Certificate.LoadCertificateFromBlob(Byte[] rawData, Object password, X509KeyStorageFlags keyStorageFlags)
at System.Security.Cryptography.X509Certificates.X509Certificate2..ctor(Byte[] rawData, String password)
//my code here

Итак, я немного искал и нашел этот ответ в виде подобного вопроса. Я попытался включить LoadUserProfile для пула приложений и теперь работает.

Проблема в том, что я не понимаю, что именно происходит, когда я устанавливаю LoadUserProfile и какие последствия могут иметь. Я имею в виду, если это "хорошая" вещь, то почему она не "on" по умолчанию и почему она существует в конце концов?

Что именно происходит, когда я устанавливаю LoadUserProfile в пуле IIS и какие его последствия могут иметь?

Ответ 1

Я имею в виду, если это "хорошая" вещь, то почему она не "on" по умолчанию и почему она там в конце?

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

Я попытался включить LoadUserProfile для пула приложений и теперь работает.

Это наиболее вероятно, потому что поставщик криптографических услуг Windows пытался хранить или загружать ключ для вашего сертификата в хранилище пользователей, а так как профиль недоступен, криптографический контекст не было доступно. Обратите внимание, что параметр Load User Profile применяется только к учетным записям пользователей. Учетные записи служб, такие как NETWORK SERVICE и ApplicationPoolIdentity, имеют специальную обработку.

Что именно происходит, когда я устанавливаю LoadUserProfile в пуле IIS

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

То, что в конечном итоге сводится к LoadUserProfile, вызывается IIS при запуске AppPool.

какие отрицательные последствия могут иметь?

Он может нарушить совместимость с приложением, запущенным на IIS 6, который не загружал пользовательский профиль. Загружаются переменные среды. Например, когда Load User Profile имеет значение true, переменная среды% TEMP% C:\Users\AccountName\AppData\Local\Temp (например). Когда false, оно C:\WINDOWS\Temp.