5

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

<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_BeginRequestApplication_AuthenticateRequest.我可以在执行期间看到 cookie Application_BeginRequest,但是在调用时它就消失了Application_AuthenticateRequest。据我所知,这似乎意味着身份验证票的反序列化失败,但我无法弄清楚为什么这会发生在多服务器环境中,而不是单服务器环境中,除了不同的机器密钥,我已经确认不是这种情况。

我还设置了自定义 MembershipProvider 和 RoleProvider,它们在每个站点上都可以独立运行。

我错过了什么?

4

2 回答 2

3

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

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

<add key="aspnet:UseLegacyFormsAuthenticationTicketCompatibility" value="true" />

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

于 2012-02-16T22:46:09.017 回答
0

对我来说,它可以在 appsettings 中添加这个键:

    <add key="aspnet:UseLegacyEncryption" value="true" />
    <add key="aspnet:UseLegacyFormsAuthenticationTicketCompatibility" value="true" />
于 2012-10-31T12:03:43.867 回答