我在负载平衡环境中的身份验证方面遇到了一些问题。负载均衡器为 F5,源地址关联持久性已打开。我的身份验证非常标准,我验证用户凭据并创建身份验证票。
string encTicket = FormsAuthentication.Encrypt(authTicket);
var faCookie = new HttpCookie(FormsAuthentication.FormsCookieName, encTicket);
Response.Cookies.Add(faCookie);
大约 50% 的时间,当登录负载平衡环境时(尽管在Sticky Session
F5 级别设置了类型),我会立即被重定向到登录页面以再次授权。我有 2 台服务器,看起来好像我对保护区的后续请求被定向到不包含我的会话信息的服务器。当为任一服务器使用内部 DNS 时,不存在此类问题,并且身份验证在 100% 的时间都可以正常工作。
在我成功到达初始页面的情况下(通过 F5),持久性工作得很好,并且我不断地被路由到正确的服务器,至少直到我的会话在指定时间后过期。但是,由于预身份验证问题,我被迫进行两次身份验证的情况太多了。
我猜
这是创建身份验证票证和 F5 处理它并保证正确持久性之间存在的某种竞争条件吗?这对我来说似乎是可行的,但这是我第一个使用这个负载平衡器的应用程序,所以我只是猜测。
有没有人处理过类似的情况?是否有任何配置应用程序端或 F5 端可以解决此问题?
更新
仔细观察,似乎这种情况发生的几率远低于 50%。50% 通常发生在我第一次尝试通过 F5 在给定日期(或在任意长的一段时间后)登录时。当我登录并尝试访问受保护的资源时,大约 50% 的时间我会返回登录页面。如果我重新加载受保护资源的 URL,我可以正常工作。这似乎为某种竞争条件的想法提供了更多证据。
为了了解频率,我还运行了一个自动化工具,它登录和注销 1000 次(使用相同的用户凭据)并且无法复制问题。但是,由于我不断地快速连续使用同一个用户,我相信 F5 会不断地路由到同一个服务器,因此它不是最有用的测试。