在多个服务器和子域上设置持久性表单身份验证

Ian*_*son 5 .net c# forms-authentication web-farm

我正在尝试跨多个服务器和子域设置表单身份验证.我为每个应用程序设置了静态机器密钥,如下所示:

<system.web>
    <machineKey validationKey="574...7A7" 
                decryptionKey="2C3...A0D" 
                validation="HMACSHA256" 
                decryption="AES" />
</system.web>
Run Code Online (Sandbox Code Playgroud)

...我的表单身份验证的配置与每个应用程序相同:

<forms loginUrl="/login" timeout="2880" defaultUrl="/" path="/" name=".SHAREDAUTH" domain="domain.com" protection="All" />
Run Code Online (Sandbox Code Playgroud)

我也试过在我的域名前加上一段时间,因为我看到有人建议,但这也不起作用.

这在我的本地计算机上运行正常,在IIS中为每个子域设置了单独的站点.它也适用于我们的开发服务器,所有站点仍然驻留在一台机器上.但是,当我部署到临时环境时,跨域身份验证将停止工作.在该环境中,我在单个服务器上运行主站点(发生登录的位置),在两个负载平衡的服务器上运行辅助站点(我的身份验证应该保留的位置).所有这些都在Windows 7(本地)或Server 2008 R2(开发和暂存)上的IIS 7下运行.

我通过在主站点上编码字符串MachineKey.Encode并在辅助服务器上解码结果来验证机器密钥是相同的,MachineKey.Decode.我还验证了.SHAREDAUTH cookie是通过检查请求传递给请求中的第二个应用程序的Firefox和Chrome报告的标题,并将调试器挂钩Application_BeginRequest,Application_AuthenticateRequest.我可以在Application_BeginRequest执行期间看到cookie ,但是在Application_AuthenticateRequest调用时它已经消失了.从我可以收集的内容来看,这似乎意味着身份验证票证的反序列化失败,但我无法弄清楚为什么在多服务器环境中可能发生这种情况,而不是单个服务器环境,除了不同的机器密钥,我已经证实并非如此.

我还设置了自定义MembershipProvider和RoleProvider,并且这些工作在每个站点上都可以独立工作.

我错过了什么?

Ian*_*son 3

因此,经过长时间的努力,我发现了MS 安全公告 MS11-100,它修复了表单身份验证中的特权提升漏洞。不幸的是,该补丁不向后兼容。它应用于我们的负载平衡服务器,但不适用于托管创建初始登录的应用程序的服务器,这意味着平衡服务器无法反序列化应用程序服务器写入的身份验证票证。

根据 MS 部署指南文章,如果您发现自己处于这种情况,您可以添加

<add key="aspnet:UseLegacyFormsAuthenticationTicketCompatibility" value="true" />
Run Code Online (Sandbox Code Playgroud)

appSettingsweb.config 中针对已安装补丁的计算机上的应用程序的部分(或计算机级配置)。或者,更好的是,确保您的托管管理公司同时将补丁应用到您的所有服务器......