ASP.NET MVC,IIS 7.5 – 跨服务器丢失会话(负载均衡)

我们有一个网站在三个networking节点上运行。 我们正在使用SQL Server会话存储。

我们最近又增加了两个,只是发现用户的会话被发送到其中一台机器时丢失了。

我们已经检查了站点ID以及机器validation密钥和解密密钥。

编辑:

我没忘记提及有问题的机器是农场中现有机器的克隆(VMWare)版本。

解决了 – 我们只是抹新的机器,并站起来一个新的服务器08安装。 这个问题的原因还不得而知。

你确认机器钥匙正在工作吗? 一种方法是如果您有表单身份validation,您可以有几行代码尝试读取身份validationCookie。 如果机器密钥无效,您将无法读取cookie,并且User.Identity.IsAuthenticated将为false。 机器密钥也是SQL会话状态所必需的,所以这是主要的嫌疑犯。

下面的一些示例代码。

如果您在machine.config(而不是web.config)中有密钥,则可能需要validation是否更新了正确的文件。 如果你同时拥有.NET 3和4,你可能在四个地方有一个machine.config文件。 我通常更新所有四个只是为了确定。

C:\ WINDOWS \ Microsoft.NET \框架\ V2.0.50727 \ CONFIG \
C:\ WINDOWS \ Microsoft.NET \框架\ v4.0.30319 \ CONFIG \
C:\ WINDOWS \ Microsoft.NET \ Framework64 \ V2.0.50727 \ CONFIG \
C:\ WINDOWS \ Microsoft.NET \ Framework64 \ v4.0.30319 \ CONFIG \

另一个远程的可能性是你可能还想要为机器密钥哈希algorithm指定validation =“xxxx”属性。 在.NET4中,默认的散列algorithm是SHA256,但在以前的版本中是SHA1。 所以包括这个通常是一个好主意,所以它们都是一样的。

ASP.NET 4重大更改 – 默认哈希algorithm现在是HMACSHA256

受保护的configuration提供者。 在Web场中共享机器密钥仅适用于RsaProtectedConfigurationProvider。 如果web.config或machine.config仅指定DpapiProtectedConfigurationProvider,则不起作用:

指定受保护的configuration提供程序
http://msdn.microsoft.com/en-us/library/68ze1hb2%28v=VS.100%29.aspx

示例cookievalidation码:

if (Request.Cookies[FormsAuthentication.FormsCookieName] != null) { try { FormsAuthenticationTicket ticket = FormsAuthentication.Decrypt(Request.Cookies[FormsAuthentication.FormsCookieName].Value); Debug.WriteLine(String.Format("Cookie timeout: {0}, ticket.Expiration.ToString("yyyy-MMM-dd HH:mm:ss"))); } catch (Exception e) { Debug.WriteLine(String.Format("Error reading cookie: {0}", e.ToString())); } } else { Debug.WriteLine("Cookie unavailable"); } 

这很可能是由于你的新服务器有一组不同的修补程序而不是旧的。 即使validation密钥和解密相同,新服务器也不会生成旧的有效令牌。 看到这个问题的优先顺序 。

您可以通过确保您的所有服务器完全更新来解决此问题。