我正在尝试跨多个服务器和子域设置表单身份验证。我为每个应用程序设置了静态机器密钥,如下所示:
<system.web>
<machineKey validationKey="574...7A7"
decryptionKey="2C3...A0D"
validation="HMACSHA256"
decryption="AES" />
</system.web>
...并且我的表单身份验证为每个应用程序配置相同:
<forms loginUrl="/login" timeout="2880" defaultUrl="/" path="/" name=".SHAREDAUTH" domain="domain.com" protection="All" />
正如我看到一些人建议的那样,我也尝试在我的域前加上句号,但这也不起作用。
这在我的本地机器上运行良好,在 IIS 中为每个子域设置了单独的站点。它在我们的开发服务器上也可以正常工作,所有站点仍然驻留在一台机器上。但是,当我部署到我们的暂存环境时,跨域身份验证停止工作。在那个环境中,我的主站点(登录发生的地方)运行在单个服务器上,辅助站点(我的身份验证应该持续存在的地方)运行在两个负载平衡的服务器上。所有都在 Windows 7(本地)或 Server 2008 R2(开发和暂存)上的 IIS 7 下运行。
我通过在主站点上编码字符串MachineKey.Encode
并在辅助服务器上解码结果来验证机器密钥是否相同MachineKey.Decode.
我还通过检查请求验证了 .SHAREDAUTH cookie 是否已传递给请求中的第二个应用程序Firefox 和 Chrome 报告的标头,并将调试器连接到Application_BeginRequest
,Application_AuthenticateRequest.
我可以在执行期间看到 cookie Application_BeginRequest
,但是在调用时它就消失了Application_AuthenticateRequest
。据我所知,这似乎意味着身份验证票的反序列化失败,但我无法弄清楚为什么这会发生在多服务器环境中,而不是单服务器环境中,除了不同的机器密钥,我已经确认不是这种情况。
我还设置了自定义 MembershipProvider 和 RoleProvider,它们在每个站点上都可以独立运行。
我错过了什么?