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