在多个服务器和子域上设置持久表单身份验证
本文关键字:设置 表单 身份验证 服务器 | 更新日期: 2023-09-27 18:24:40
我正在尝试跨多个服务器和子域设置表单身份验证。我为每个应用程序设置了静态机器密钥,如下所示:
<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.
解码结果来验证机器密钥是相同的。我还通过检查Firefox和Chrome报告的请求标头来验证.SHAREDAUTH cookie是否传递给了请求中的第二个应用程序,并且将调试器挂接到Application_BeginRequest
和Application_AuthenticateRequest.
,我可以在Application_BeginRequest
执行期间看到cookie,但当调用Application_AuthenticateRequest
时它就不见了。据我所知,这似乎意味着身份验证票证的反序列化失败了,但我不明白为什么除了不同的机器密钥之外,这种情况可能发生在多服务器环境中,而不是单服务器环境中。
我还设置了一个自定义的MembershipProvider和RoleProvider,它们在每个网站上都可以独立工作。
我错过了什么?
因此,经过长时间的努力,我发现了MS安全公告MS11-100,它修补了表单身份验证中的权限提升漏洞。不幸的是,该修补程序不向后兼容。它被应用于我们的负载平衡服务器,但没有应用于托管创建初始登录的应用程序的服务器,这意味着平衡服务器无法反序列化应用程序服务器编写的身份验证票证。
根据MS部署指南文章,如果你发现自己处于这种情况,你可以添加
<add key="aspnet:UseLegacyFormsAuthenticationTicketCompatibility" value="true" />
已安装修补程序的计算机上的应用程序的web.config中的appSettings
部分(或计算机级配置)。或者,更好的是,确保你是托管管理公司在同一时间将补丁应用于你的所有服务器。。。
对我来说,在appsettings中添加以下键是有效的:
<add key="aspnet:UseLegacyEncryption" value="true" />
<add key="aspnet:UseLegacyFormsAuthenticationTicketCompatibility" value="true" />