同步不同子域中的cookie和会话(asp.net)

时间:2009-01-14 17:56:33

标签: asp.net cookies session

我正在asp.net中构建一个站点,并且有多个子域。例如, one.cookies.com two.cookies.com

我希望我的用户能够在任一子域登录并登录这两个网站。此外,我希望会话和Cookie 保持同步。到目前为止,我还没有找到一种可靠的方法来做到这一点。

4 个答案:

答案 0 :(得分:9)

如果要同步ASP.NET会话并且未使用表单身份验证(例如,您的站点没有登录名),请尝试将以下代码添加到Globals.asax文件中。这对我来说就像一个冠军,给我带来了一些严重的悲伤。

protected void Application_PreRequestHandlerExecute(Object sender, EventArgs e)
{
  /// only apply session cookie persistence to requests requiring session information
  #region session cookie

  if (Context.Handler is IRequiresSessionState || Context.Handler is IReadOnlySessionState )
  {
    /// Ensure ASP.NET Session Cookies are accessible throughout the subdomains.
    if (Request.Cookies["ASP.NET_SessionId"] != null && Session != null && Session.SessionID != null)
    {
      Response.Cookies["ASP.NET_SessionId"].Value = Session.SessionID;
      Response.Cookies["ASP.NET_SessionId"].Domain = ".know24.net"; // the full stop prefix denotes all sub domains
      Response.Cookies["ASP.NET_SessionId"].Path = "/"; //default session cookie path root         
    }
  }
  #endregion    
}

我发现这最初发布在这里: http://www.know24.net/blog/ASPNET+Session+State+Cookies+And+Subdomains.aspx

答案 1 :(得分:8)

创建Cookie时,您可以设置域名:

HttpCookie cookie = new HttpCookie("name", "value");
cookie.Domain = "cookies.com";

这样可以从cookies.com的所有子域访问您的cookie。

如果您使用的是FormsAuthentication,那么您可以在web.config中为auth cookie设置域名:

<forms name=".ASPXAUTH"
       loginUrl="login.aspx"
       defaultUrl="default.aspx"
       protection="All"
       timeout="30"
       path="/"
       requireSSL="false"
       domain="cookies.com">
</forms>

请注意,对于在多个子域上工作的单点登录,您的ASP.NET应用程序必须共享相同的machine keys,如此CodeProject article中所述。

在不同子域(不同的工作进程)之间共享会话更加困难,因为会话受限于应用程序,您必须实现自定义会话同步机制。

答案 2 :(得分:1)

是的,您需要使用“.cookies.com”而不是“cookies.com”

答案 3 :(得分:0)

我相信为http://cookies.com制作了Cookie。 (没有子域名或www列出)