我遇到了以下问题。
我运行以下代码
var binaryData = File.ReadAllBytes(pathToPfxFile);
var cert = new X509Certificate2(binaryData, password);
在两个过程中。其中一个进程在LOCAL_SYSTEM
下运行,并且此代码成功。另一个在IIS中在属于“Users”本地组的本地用户帐户下运行,在那里我得到以下异常:
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
所以我用Google搜索了一下,发现this answer是一个类似的问题。我尝试为应用程序池启用LoadUserProfile
,现在可以正常工作。
问题是当我设置LoadUserProfile
以及可能产生的后果时,我不知道到底发生了什么。我的意思是,如果它是一个“好”的东西那么为什么它默认不是“开启”,为什么它毕竟在那里?
当我在IIS池中设置LoadUserProfile
时会发生什么,以及它会产生什么负面影响?
答案 0 :(得分:101)
我的意思是,如果它是一个“好”的东西那么为什么它默认不是“开启”,为什么它毕竟在那里?
IIS 6从未加载用户配置文件。我认为默认情况下这是关闭以保持行为一致,管理员必须选择加入它。
我尝试为应用程序池启用LoadUserProfile,现在可以正常工作。
这很可能是因为Windows加密服务提供商试图在用户存储中存储或加载证书的密钥,并且由于配置文件不可用,因此cryptographic context不可用。请注意,Load User Profile
设置仅适用于用户帐户。 NETWORK SERVICE和ApplicationPoolIdentity等服务帐户有特殊处理。
在IIS池中设置LoadUserProfile时会发生什么?
好了,加载了用户个人资料。这包括他们的加密存储,环境变量,如%TEMP%,以及其他。
当AppPool启动时,IIS会调用它最终归结为LoadUserProfile
。
它有什么负面后果?
它可能会破坏与在IIS 6上运行但未加载用户配置文件的应用程序的向后兼容性。加载环境变量。例如,当Load User Profile为Load时,%TEMP%环境变量为C:\Users\AccountName\AppData\Local\Temp
(例如)。如果为false,则为C:\WINDOWS\Temp
。