Asp.net

同步不同子域中的 cookie 和會話 (asp.net)

  • November 27, 2015

我在 asp.net 中建立一個站點並有多個子域。例如,one.cookies.com two.cookies.com

我希望我的使用者能夠登錄任一子域並登錄兩個網站。此外,我希望會話和 cookie保持同步。到目前為止,我還沒有找到可靠的方法來做到這一點。

創建 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 應用程序必須共享相同的機器密鑰,如本 CodeProject文章中所述

在不同的子域(不同的工作程序)之間共享會話更加困難,因為會話受限於應用程序,您必須實現自定義會話同步機制。

如果您想要同步 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

引用自:https://stackoverflow.com/questions/444018