我们有一个在 3 个 Web 节点上运行的站点。我们正在使用 SQL Server 会话存储。
我们最近又添加了两台,却发现当用户被发送到其中一台机器时,他们的会话就丢失了。
我们已经检查了站点ID以及机器验证密钥和解密密钥。
编辑:
我确实忘了提到,所讨论的机器是服务器场中现有机器的克隆(VMWare)版本。
已解决 - 我们只是清理了新机器并重新安装了 Server 08。此问题的原因仍不清楚。
答案1
您是否已确认机器密钥有效?一种方法是,如果您有表单身份验证,则可以编写几行代码尝试读取身份验证 cookie。如果机器密钥无效,您将无法读取 cookie,并且 User.Identity.IsAuthenticated 将为 false。SQL 会话状态也需要机器密钥,因此这是主要嫌疑人。
下面是一些示例代码。
如果您的密钥在 machine.config(而不是 web.config)中,您可能需要验证是否更新了正确的文件。如果您同时拥有 .NET 3 和 4,则可能在四个地方都有 machine.config 文件。我通常会更新所有四个地方以确保万无一失。
C:\Windows\Microsoft.NET\Framework\v2.0.50727\CONFIG\
C:\Windows\Microsoft.NET\Framework\v4.0.30319\Config\
C:\Windows\Microsoft.NET\Framework64\v2.0.50727\Config\
C:\Windows\Microsoft.NET\Framework64\v4.0.30319\Config\
另一个可能性是,您可能还想为机器密钥哈希算法指定 validation="xxxx" 属性。在 .NET4 中,默认哈希算法是 SHA256,但在以前的版本中是 SHA1。因此,通常最好将其包括在内,以便它们都相同。
ASP.NET 4 重大变化 - 默认哈希算法现为 HMACSHA256
受保护的配置提供程序。在 Web 场中共享计算机密钥仅适用于 RsaProtectedConfigurationProvider。如果 web.config 或 machine.config 仅指定 DpapiProtectedConfigurationProvider,则它将不起作用:
指定受保护的配置提供程序
http://msdn.microsoft.com/en-us/library/68ze1hb2%28v=VS.100%29.aspx
示例 Cookie 验证代码:
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");
}
答案2
这很可能是因为您的新服务器与旧服务器的补丁集不同。即使验证密钥和解密相同,新服务器也不会生成在旧服务器上有效的令牌。请参阅此问题以了解优先顺序。
您可以通过确保所有服务器都完全更新来解决此问题。