【问题标题】:Session being reset when using sub-domain使用子域时会话被重置
【发布时间】:2011-01-24 23:32:36
【问题描述】:

我正在尝试在我的 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”例如。

有人知道是什么原因造成的吗?

干杯

【问题讨论】:

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


    【解决方案1】:

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

    有一些可能的黑客攻击。参见例如最后回复this question

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

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

    【讨论】:

    • 这里是另一个链接,它更详细地描述了@Damien_The_Unbeliever 发布的解决方案。 know24.net/blog/…
    【解决方案2】:

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

    1. 跨多个子域共享会话信息。
    2. 登录多个域。
    3. 在回发期间保持在正确的域上。

    要在多个子域之间共享会话信息,您需要将会话 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 以确保它们具有相同的值,以便它们可以解密会话、登录令牌、视图状态、等正确。

    【讨论】:

      猜你喜欢
      • 2011-08-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-07-02
      • 1970-01-01
      • 2012-12-25
      • 2013-11-19
      相关资源
      最近更新 更多