在负载平衡环境中工作时无法检索FormsAuthentication cookie

时间:2015-03-19 06:31:19

标签: c# asp.net-mvc forms-authentication load-balancing

我们正在使用3台服务器实施负载均衡器。假设这样的情况。用户从Server1登录系统,使用身份验证cookie登录Server1响应。如果来自该(经过身份验证的)用户的任何连续请求在Server1上做了一切正常,但是如果在Server2或Server3上发出请求而不是问题发生。基本上,Cookie在[{1}}中预先发布,但在使用以下代码在HTTP headers的{​​{1}}中检索时

Global.asax

它出现了Application_AuthenticateRequest。我认为验证cookie中存在的票证本身应该存在问题。该票由于某种原因无效。当我搜索网络时,我发现MachineKey用于加密和解密(我是对的吗?这是我猜的)票证,不同的机器有不同的MachineKey。我可以在服务器之间共享MachineKey吗?我会以这种方式暴露于任何一种脆弱性吗?在这种情况下,最好的解决方法是什么。提前谢谢。

1 个答案:

答案 0 :(得分:1)

这是负载平衡环境的典型问题。要解决此问题,您必须在web.config文件中指定计算机密钥。负载平衡服务器上的所有web.config文件都需要具有相同的机器密钥。

机器密钥规范的一个例子如下

<machineKey 
    validationKey="35E679E7C03505829CDAEA7C14C6EEEBFA8A786E2F10FB24921ECC1965AA1B18B1794234DF4DD4247CA57119CB0CF806BFCED445C303A22E8C5D33D381F6A37ABFD5" 
    decryptionKey="20FD16825FC53SFASDRWERSF5565656F5E5A5F47A49114CD2E1DE8EE70A853BFAE7E3D1F0" 
    validation="SHA1" 
    decryption="AES" />  

Read more about machine key.

正如您所说,机器密钥值用于加密和解密身份验证cookie。如果未在服务器上明确指定此值,则它们将生成自己的值。现在服务器1的解密密钥在服务器2上不相同,因此解密失败。如果在每个服务器上明确指定密钥,则所有密钥都将使用相同的密钥进行加密和解密。