为什么禁用 IsolateApps 时 ASP.NET 会自动生成不同的机器密钥?

Ste*_*ngs 5 iis asp.net iis-7.5

我在 IIS 7.5 中托管了两个 Web 应用程序。他们必须共享 ASP.NET 表单身份验证 cookie。由于我不想将机器密钥放在 Web.config 中(我没有使用网络农场,我不希望密钥在 web.config 文件中可见),我已将其设置为使用以下设置:

<machineKey validationKey="AutoGenerate" decryptionKey="AutoGenerate" />
Run Code Online (Sandbox Code Playgroud)

根据文档,这应该会导致 IIS 为两个 Web 应用程序自动生成相同的机器密钥。在我的 Windows 7 和 Windows 8 开发人员机器上,这按预期工作。任何一个 Web 应用程序都可以对用户进行身份验证,并且两个应用程序都可以识别相同的身份验证 cookie。

但是,当我将此设置移至在 Windows Server 2008 R2 上运行的生产环境时,这两个应用程序将不会共享身份验证 cookie。当 WebAppA 对用户进行身份验证时,WebAppB 无法解密 auth cookie 并强制用户重新进行身份验证。当他们这样做时,新的身份验证 cookie 对 WebAppA 无效。

我已经证明它通过将两个应用程序中的机器密钥显式设置为相同的密钥来使用单独的机器密钥:

<machineKey validationKey="F801AB..." decryptionKey="ADB3C1..." />
Run Code Online (Sandbox Code Playgroud)

当我这样做时,身份验证就像在我的开发人员机器上一样工作。

我的开发和生产环境之间的什么差异可能导致这种情况?

Ste*_*ngs 9

当 IIS 自动生成机器密钥时,它存储在HKEY_CURRENT_USER 中。因此,要共享自动生成的机器密钥,Web 应用程序必须以同一用户身份运行。详细信息在此博客文章中。相关摘录如下:

基本机器密钥存储在注册表中的以下位置:

HKCU\Software\Microsoft\ASP.NET\4.0.30319.0\AutoGenKeyV4
Run Code Online (Sandbox Code Playgroud)

请注意,此密钥位于 HKEY_CURRENT_USER 配置单元中,因此生成的机器密钥属于运行应用程序配置文件的用户。这意味着如果您在 IIS 中有两个以相同进程标识运行的应用程序,它们将使用相同的机器密钥!

就我而言,这两个 Web 应用程序以不同的身份在不同的应用程序池中运行。因此,他们生成了不同的机器密钥。在我的开发人员机器上,它们以相同的身份运行。

通过将两个应用程序放在同一个应用程序池中(或以相同的身份运行两个应用程序池),它们使用了相同的自动生成的机器密钥。