1. ホーム
  2. c#

[解決済み] IISプールのLoadUserProfileを設定すると、具体的にどのようなことが起こりますか?

2022-02-19 19:02:28

質問

次のような問題に直面しました。

次のコードを実行します。

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

を2つのプロセスで実行します。プロセスのうちの1つは LOCAL_SYSTEM で、このコードは成功します。もう1つは、ローカルグループに属するローカルユーザーアカウントで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 そして、それがどのような結果をもたらすのか。つまり、もしそれが良いことであるなら、なぜデフォルトでオンになっていないのか、そしてなぜそれがあるのか、ということです。

を設定すると、具体的にどうなるのでしょうか? LoadUserProfile また、それがどのような悪影響を及ぼすのでしょうか?

解決方法は?

<ブロッククオート

つまり、もしそれが良いことであるなら、なぜデフォルトでオンになっていないのですか?

IIS 6ではユーザープロファイルを読み込んだことはありません。動作の一貫性を保つためにデフォルトではオフになっており、管理者がオプトインする必要があるのだと思われます。

アプリケーションプールのLoadUserProfileを有効にしてみたところ、動作するようになりました。

これは、Windows Cryptographic Service Provider がユーザー ストアに証明書のキーを保存またはロードしようとして、プロファイルが利用できないため 暗号化コンテキスト は利用できませんでした。なお Load User Profile の設定は、ユーザーアカウントにのみ適用されます。NETWORK SERVICEやApplicationPoolIdentityのようなサービスアカウントは、特別な取り扱いがあります。

IISプールでLoadUserProfileを設定すると、具体的に何が起こるのか?

さて、ユーザープロファイルが読み込まれます。これには、彼らの暗号ストア、%TEMP%などの環境変数、およびその他のものが含まれます。

最終的に煮詰まるのは LoadUserProfile は、AppPoolの起動時にIISから呼び出される。

どのような悪影響があるのでしょうか?

ユーザープロファイルを読み込まないIIS 6上で動作していたアプリとの後方互換性が壊れる可能性があります。環境変数は読み込まれます。たとえば、Load User Profile が true の場合、%TEMP% 環境変数が C:\Users\AccountName\AppData\Local\Temp (など)。falseのときは C:\WINDOWS\Temp .