我在 IIS 7.5 中托管两个 Web 应用程序。它们必须共享 ASP.NET Forms 身份验证 cookie。由于我不想将机器密钥放在 Web.config 中(我没有使用 Web 场,并且我不希望密钥在 web.config 文件中可见),因此我已将其设置为自动生成,设置如下:
<machineKey validationKey="AutoGenerate" decryptionKey="AutoGenerate" />
根据文档,这应该会导致 IIS 为这两个 Web 应用程序自动生成相同的机器密钥。在我的 Windows 7 和 Windows 8 开发人员计算机上,这按预期工作。任何一个 Web 应用程序都可以对用户进行身份验证,并且两个应用程序都可以识别相同的身份验证 cookie。
但是,当我将此设置移至在 Windows Server 2008 R2 上运行的生产环境时,这两个应用程序将不会共享身份验证 cookie。当 WebAppA 对用户进行身份验证时,WebAppB 无法解密身份验证 cookie,并强制用户重新进行身份验证。当他们这样做时,新的身份验证 cookie 对 WebAppA 无效。
我已经证明它通过将两个应用程序中的机器密钥明确设置为相同的密钥来使用单独的机器密钥:
<machineKey validationKey="F801AB..." decryptionKey="ADB3C1..." />
当我这样做时,身份验证就像在我的开发人员机器上一样工作。
我的开发环境和生产环境之间的哪些差异可能导致了这种情况?
答案1
当 IIS 自动生成机器密钥时,它存储在键值对。因此,要共享自动生成的机器密钥,Web 应用必须以同一用户身份运行。详细信息请参见这篇博文相关摘录如下:
基本机器密钥存储在注册表中的以下位置:
HKCU\Software\Microsoft\ASP.NET\4.0.30319.0\AutoGenKeyV4
请注意,此密钥位于 HKEY_CURRENT_USER 配置单元中,因此生成的计算机密钥属于运行应用程序配置文件的用户。这意味着,如果您在 IIS 中有两个使用相同进程标识运行的应用程序,它们将使用相同的计算机密钥!
就我而言,这两个 Web 应用程序以不同的身份在不同的应用程序池中运行。因此,它们生成了不同的机器密钥。在我的开发人员机器上,它们以相同的身份运行。
通过将两个应用程序放在同一个应用程序池中(或以相同的标识运行两个应用程序池),它们使用相同的自动生成的机器密钥。