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

我在IIS 7.5中托pipe两个Web应用程序。 他们必须共享ASP.NET窗体身份validationcookie。 由于我不想在Web.config中放置机器密钥(我没有使用web farm,也不想在web.config文件中显示该密钥),所以我将它设置为自动生成以下设置:

<machineKey validationKey="AutoGenerate" decryptionKey="AutoGenerate" /> 

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

但是,当我将此设置移动到在Windows Server 2008 R2上运行的产品时,这两个应用程序将不共享身份validationCookie。 当WebAppA对用户进行身份validation时,WebAppB无法解密身份validationcookie并强制用户重新进行身份validation。 当他们这样做时,新的身份validationcookie不适用于WebAppA。

我已经certificate,它使用单独的机器密钥,明确地将两个应用程序中的机器密钥设置为相同的密钥:

 <machineKey validationKey="F801AB..." decryptionKey="ADB3C1..." /> 

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

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

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

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

 HKCU\Software\Microsoft\ASP.NET\4.0.30319.0\AutoGenKeyV4 

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

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

通过将这两个应用程序放在同一个应用程序池中(或者同时运行两个应用程序池),他们使用相同的自动生成的机器密钥。