Web-farm的共享SQLServer会话状态的登录问题

时间:2010-10-05 13:05:18

标签: asp.net sql-server session-state web-farm

根据a question I posted yesterday,我们网站的DNS结构已更改为循环DNS,它实际上在两个生产服务器之间来回切换。我们对两个prod服务器的web.config都有:

  • <sessionState mode="SQLServer" ... >指向同一个共享数据库
  • 每台服务器上的machineKey在两者之间是一致的(这是我昨天发布的主要内容)。
  • [更新] <forms domain=".mydomain.com" ... >标记
  • 中的同一个域

当我们在网站上使用登录功能时,登录实际上会向第3个网站发出Web服务请求,该网站会对用户进行身份验证。如果生成的响应表明它是成功登录,那么我们使用FormsAuthentication将用户登录到:

FormsAuthentication.SetAuthCookie(strUserID, true);

我们的问题是,在某些网页上我们看到我们已登录,有些则不是。这是否表明我们没有完成在两个prod服务器之间共享会话的最后一步,或者我们的SQL服务器会话数据库是否会被破坏?

提前致谢

更新: 我们用于确定用户是否已登录的代码非常基本:

HttpContext.Current.User.Identity.IsAuthenticated

更新2

当我点击prod1.mysite.com(或prod2.mysite.com)时,我会收到名为"ASP.NET_SessionId"的Cookie,但是当我点击直播公共网址www.mysite.com时,我不知道这个曲奇饼。这是问题的一部分吗?

解决

事实证明,我们在这里所做的一切都是正确的,并且由于Akamai的缓存配置,我们使用Akamai的实时网站被缓存在各个州。已确认在服务器之间共享您已登录的状态。

1 个答案:

答案 0 :(得分:0)

你可以做的一件事就是使用Firefox的Firebug插件来确保在登录后按照预期将身份验证cookie发送到浏览器,尽管你看到你登录的某些页面我会期望情况就是这样。
要检查的另一件事是,域名已正确设置为身份验证cookie,并且它对您网站上的所有页面都有效 这通常在表单标记中的web.config中设置,如下所示,并且在Web场中的每个服务器上应该相同。

<authentication mode="Forms">
    <forms name="yourAuthCookie" loginUrl="/login.aspx" protection="All" path="/" domain="mydomain.com" timeout="30"/>
</authentication>

如果这一切都正确,那么您的服务器之间的会话可能无法正确共享,尽管您在问题中描述的设置似乎涵盖了所需的设置。