在负载平衡环境中,Fed auth cookie解密失败

时间:2015-07-09 11:50:23

标签: asp.net-mvc-4 cookies forms-authentication wif

我在负载均衡器后面有2个Web服务器。我在另一个VM中有一个单独的STS(带WIF的安全令牌服务应用程序)应用程序。

当用户尝试登录时,用户在Web应用程序的登录页面中进入组织,该用户将用户重定向(此处发生家庭领域发现)到STS应用程序以输入用户名和密码。 STS在登录过程中与ADFS服务器通信。用户单击从STS应用程序登录后,将创建安全令牌并将其重定向到Web应用程序,该应用程序将创建表单身份验证cookie并重定向到主页。

这完全没问题。当用户突然导航到网站中的不同页面时,用户退出。当负载均衡器重定向到另一台服务器时会发生这种情况(如果我的登录发生在服务器A上,只要请求指向服务器A就可以了。但是一旦我的请求被负载均衡器定向到服务器B,我退出了。)

当我在非STS模式下运行应用程序时(仅使用表单身份验证),它在上述方案中正常工作(当负载均衡器向两个服务器发送请求时,用户不会注销)。两个Web服务器都具有相同的asp.net MVC Web应用程序副本,具有相同的机器密钥等。

所以它应该是一个与STS有关的问题。表单身份验证cookie存储“用户ID”,一个guid,用于加载会话变量。根据应用程序日志,一旦请求被发送到不是用于登录的服务器的服务器,它就不会从cookie识别用户ID(作为guid为空)。我是STS领域的新手。在这里,我将分享开发工具中显示的cookie详细信息。

这里发生了什么?难道“FedAuth cookies”无法由最初创建Web服务器的服务器解密吗?请帮忙!!!

登录后

Cookies, enter image description here

在登录时从STS应用程序重定向到Web应用程序时的Cookie, enter image description here

应用程序托管在Azure环境中

1 个答案:

答案 0 :(得分:0)

我的猜测是,eloadbalancer后面的两台服务器都应该使用相同的机器密钥。这用于会话cookie。 这可以通过更改密钥的设置和更改sessionsecurity tokenhandler来完成:

            <remove type="System.IdentityModel.Tokens.SessionSecurityTokenHandler, System.IdentityModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
    <add type="System.IdentityModel.Services.Tokens.MachineKeySessionSecurityTokenHandler, System.IdentityModel.Services, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />