2015-03-19 36 views
1

我们正在实施带有3个服务器的负载平衡器。假设这样的情况。用户使用身份验证cookie从Server1和Server1响应登录到系统。如果来自那个(认证的)用户的任何连续的请求在Server1上都做得很好,但是如果在Server2或Server3上发出的请求比发生的问题更为严重。基本上cookie将被presend在HTTP headersGlobal.asaxApplication_AuthenticateRequest用下面的代码在负载平衡环境中工作时无法检索FormsAuthentication Cookie

var authCookie = Request.Cookies[FormsAuthentication.FormsCookieName]; 

检索,当它出来是null。我认为认证cookie中存在票证本身应该存在问题。由于某种原因,票证无效。在我搜索网页时,我发现MachineKey用于加密和解密(我是对吗?这是我的猜测)票据,而不同的机器具有不同的MachineKey。我可以在服务器之间共享MachineKey吗?我会以这种方式接触任何形式的保险吗?在这种情况下什么是最好的解决方法。提前致谢。

回答

1

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

机密钥规范的一个例子下面

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

Read more about machine key.

是如你说,计算机密钥值被用于加密和解密的认证的cookie。如果这些值未在服务器上明确指定,则它们将生成它们自己的值。现在,服务器1上的解密密钥在服务器2上不会相同,因此解密失败。如果您在每台服务器上明确指定密钥,则所有这些密钥都将使用相同的密钥进行加密和解密。

+0

太好了。这正是我所期待的。 – Dimitri 2015-03-19 06:56:16