当我设置IIS池的LoadUserProfile时会发生什么?

时间:2013-06-17 13:47:16

标签: c# .net iis-7 x509certificate application-pool

我遇到了以下问题。

我运行以下代码

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时会发生什么,以及它会产生什么负面影响?

1 个答案:

答案 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