当我设置 IIS 池的 LoadUserProfile 时究竟会发生啥?

Posted

技术标签:

【中文标题】当我设置 IIS 池的 LoadUserProfile 时究竟会发生啥?【英文标题】:What exactly happens when I set LoadUserProfile of IIS pool?当我设置 IIS 池的 LoadUserProfile 时究竟会发生什么? 【发布时间】:2013-06-13 12:03:01 【问题描述】:

我遇到了以下问题。

我运行以下代码

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

所以我用谷歌搜索了一下,发现this answer 有一个类似的问题。我尝试为应用程序池启用LoadUserProfile,它现在可以工作了。

问题是我不知道设置LoadUserProfile 时到底发生了什么以及可能产生的后果。我的意思是,如果它是“好”的东西,那么为什么默认情况下它不是“开启”的,为什么它毕竟存在?

当我在 IIS 池中设置 LoadUserProfile 时究竟会发生什么,它会产生什么负面后果?

【问题讨论】:

只是事后诸葛亮,如果加载用户配置文件对您来说有问题,您可以将您的证书加载更改为new X509Certificate2(binaryData, password, X509KeyStorageFlags.MachineKeySet),这样就不需要用户配置文件了。 如果作为 ApplicationPoolIdentity 运行,您将需要使用new X509Certificate2(keyFilePath, keyFilePassword, X509KeyStorageFlags.MachineKeySet | X509KeyStorageFlags.EphemeralKeySet),这样可以避免将私钥写入存储并且不需要服务器上的管理权限。 【参考方案1】:

我的意思是,如果它是“好”的东西,那么为什么默认情况下它不是“开启”的,为什么它毕竟存在呢?

IIS 6 从不加载用户配置文件。我假设默认情况下这是关闭的以保持行为一致,并且管理员必须选择加入。

我尝试为应用程序池启用 LoadUserProfile,它现在可以工作了。

这很可能是因为 Windows 加密服务提供程序试图在用户存储中存储或加载您的证书的密钥,并且由于配置文件不可用,cryptographic context 不可用。请注意,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

【讨论】:

+1 将 NETWORK SERVICE 作为应用程序池标识,但 ApplicationPoolIdentity 对我来说并不成功。 “它可能会破坏与在 IIS 6 上运行的应用程序的向后兼容性,该应用程序未加载用户配置文件。”我猜它还具有性能(必须实际加载配置文件;这意味着,例如,加载 HKCU 注册表配置单元)和安全性(更大的潜在向量)影响。 是否可以在 IIS 中设置 LoadUserProfile=true 并将默认临时文件夹 %TEMP% 位置从 C:\Users\C:\Users\AccountName\AppData\Local\Temp 更改为其他位置?例如“D:\AppTempData” Murali Murugesan - 你有没有得到这个问题的答案?我有同样的问题。我想更改默认的临时目录。 我在几年前遇到过构建一个后端服务,该服务调用受 X509 客户端证书身份验证保护的远程 Web 服务。因为个人证书存储在用户的配置文件中,所以在安装服务时,我必须以服务的登录帐户登录到目标服务器,这会创建一个用户配置文件,然后将客户端证书安装到登录帐户的证书存储中。之后,客户端证书将在运行时加载。

以上是关于当我设置 IIS 池的 LoadUserProfile 时究竟会发生啥?的主要内容,如果未能解决你的问题,请参考以下文章

如何设置IIS程序池的回收时间,才能最大程度的减少对用户的影响?

如何设置IIS程序池的回收时间,才能最大程度的减少对用户的影响?

在C#/ Powershell中 - 是否可以更改IIS应用程序池的空闲时间?

iis如何处理并发请求

IIS 请求 超时设置

IIS7 应用程序池的 托管管道模式与集成模式小结转帖