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