我们有一个网站在三个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密钥和解密相同,新服务器也不会生成旧的有效令牌。 看到这个问题的优先顺序 。
您可以通过确保您的所有服务器完全更新来解决此问题。