我正在asp.net中构建一个站点,并且有多个子域。例如, one.cookies.com two.cookies.com
我希望我的用户能够在任一子域登录并登录这两个网站。此外,我希望会话和Cookie 保持同步。到目前为止,我还没有找到一种可靠的方法来做到这一点。
答案 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列出)