我在 IIS 7.5 中托管了两个 Web 应用程序。他们必须共享 ASP.NET Forms Authentication cookie。由于我不想将机器密钥放在 Web.config 中(我没有使用网络农场,并且我不希望密钥在 web.config 文件中可见),我已将其设置为自动生成以下设置:
<machineKey validationKey="AutoGenerate" decryptionKey="AutoGenerate" />
根据文档,这应该会导致 IIS 为两个 Web 应用程序自动生成相同的机器密钥。在我的 Windows 7 和 Windows 8 开发人员机器上,这按预期工作。任何一个 Web 应用程序都可以对用户进行身份验证,并且两个应用程序都识别相同的身份验证 cookie。
但是,当我将此设置转移到在 Windows Server 2008 R2 上运行的生产环境中时,这两个应用程序将不会共享身份验证 cookie。当 WebAppA 对用户进行身份验证时,WebAppB 无法解密 auth cookie 并强制用户重新进行身份验证。当他们这样做时,新的身份验证 cookie 对 WebAppA 无效。
我已经通过将两个应用程序中的机器密钥显式设置为相同的密钥来证明它使用单独的机器密钥:
<machineKey validationKey="F801AB..." decryptionKey="ADB3C1..." />
当我这样做时,身份验证就像在我的开发人员机器上一样工作。
我的开发和生产环境之间的差异可能会导致这种情况吗?
当 IIS 自动生成机器密钥时,它存储在HKEY_CURRENT_USER中。因此,要共享自动生成的机器密钥,Web 应用程序必须以同一用户身份运行。详细信息在这篇博文中。相关摘录如下:
就我而言,这两个 Web 应用程序在不同的应用程序池中以不同的身份运行。因此,他们生成了不同的机器密钥。在我的开发人员机器上,它们以相同的身份运行。
通过将两个应用程序放在同一个应用程序池中(或以相同的身份运行两个应用程序池),它们使用了相同的自动生成的机器密钥。