使用子域时会话被重置

时间:2010-03-08 13:14:53

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

我正在尝试在我的ASP.NET网站中使用子域,但是我遇到了一些重置会话的问题。

我已将主机文件编辑为'localhost','one.localhost'和'two.localhost'。我可以访问这些URL中的任何一个并执行我需要执行的操作并登录到我的系统。会话模式在web.config中定义如下:

<sessionState cookieless="false" mode="SQLServer" timeout="300" 
        sqlConnectionString="Data Source=MyDatabase;user id=User1;password=pass"/>

我正在使用SQLServer,因为该网站将作为webfarm运行。

我发现当我点击导致回发的内容时,所有会话都会丢失并创建一个新的会话ID,当发生这种情况时,我的网站现在是'localhost'而不是登录'one.localhost'例如。

有谁知道可能导致这种情况的原因?

干杯

2 个答案:

答案 0 :(得分:3)

您的问题似乎有几个问题:

  1. 跨多个子域共享会话信息。
  2. 登录多个域。
  3. 在回发期间保持正确的域名。
  4. 要跨多个子域共享会话信息,您需要将会话cookie写入正确的域,在本例中为.example.com - 请在此处查看更多信息:"ASP.NET Session State, Cookies and Sub-domains"

    如果您希望用户同时登录所有域,并且您正在使用表单身份验证,则可以使用forms elementdomain属性(请注意域路径中的前导句点) ):

    <forms 
       name="name" 
       loginUrl="URL" 
       defaultUrl="URL"
       domain=".example.com">
    </forms>
    

    您需要在所有网站上配置此功能。

    至于为什么你被重定向到localhost而不是在回发上的one.localhost,你需要看一下已经渲染的源(你是否包括一些基本的href信息,或者你的表格是否明确)回发到localhost而不是one.localhost)?查看浏览器正在执行的操作的一个好工具是Fiddler

    最后,作为将其部署到多个服务器的时候,请不要忘记在所有站点上configure your MachineKey以确保它们具有相同的值,以便它们可以解密会话,登录令牌, viewstate等正确。

答案 1 :(得分:1)

基本上,登录cookie中设置的域特定于one.localhost。

有一些可能的黑客攻击。见例如this question的最后一个答案:

在登录/开始页面中,运行以下命令:

Response.Cookies["ASP.NET_SessionId"].Value = Session.SessionID;
Response.Cookies["ASP.NET_SessionId"].Domain = ".mydomain.com";