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

Cannot retrieve FormsAuthentication cookie when working in load balanced environment

我们正在使用 3 个服务器实施负载平衡器。假设这样的情况。用户从 Server1 登录系统,Server1 使用身份验证 cookie 进行响应。如果来自那个(经过身份验证的)用户的任何连续请求是在 Server1 上发出的,一切都很好,但是如果请求是在 Server2 或 Server3 上发出的,那么问题就会发生。基本上,cookie 存在于 HTTP headers 中,但在 Global.asaxApplication_AuthenticateRequest 中使用以下代码检索它时

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

结果是null。我认为身份验证 cookie 中存在的票证本身应该存在问题。由于某种原因,该票无效。当我在网上搜索时,我发现 MachineKey 用于加密和解密(我是对的吗?这是我的猜测)票,并且不同的机器具有不同的 MachineKey。我可以在服务器之间共享 MachineKey 吗?这样我会暴露在任何类型的漏洞中吗?在这种情况下最好的解决方法是什么。提前致谢。

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

机器密钥规范示例如下

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

Read more about machine key.

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