我正在asp.net中构建一个站点,并有多个子域.例如,one.cookies.com two.cookies.com
我希望我的用户能够在任一子域登录并登录这两个网站.另外,我希望会话和cookie同步.到目前为止,我还没有找到一种可靠的方法来做到这一点.
小智 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
}
Run Code Online (Sandbox Code Playgroud)
我发现这个最初发布在这里:http: //www.know24.net/blog/ASPNET+Session+State+Cookies+And+Subdomains.aspx
创建cookie时,您可以设置域:
HttpCookie cookie = new HttpCookie("name", "value");
cookie.Domain = "cookies.com";
Run Code Online (Sandbox Code Playgroud)
这样,您就可以从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>
Run Code Online (Sandbox Code Playgroud)
请记住,对于在多个子域上工作的单点登录,ASP.NET应用程序必须共享相同的计算机密钥,如本CodeProject 文章中所述.
在不同子域(不同的工作进程)之间共享会话更加困难,因为会话受限于应用程序,您必须实现自定义会话同步机制.