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

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

我们有一个在 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

这很可能是因为您的新服务器与旧服务器的补丁集不同。即使验证密钥和解密相同,新服务器也不会生成在旧服务器上有效的令牌。请参阅此问题以了解优先顺序

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

相关内容