首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> ASP.NET 基礎 >> 關於ASP.NET

ASP.NET 跨子域 Session 共享:Cookie Domain 設定與 Session_Start 同步實戰

     編輯:關於ASP.NET

多子域系統(a.example.com、b.example.com、api.example.com)需共享登入狀態。核心在於將 Session ID Cookie 的 Domain 設為父域(.example.com),使所有子域請求自動攜帶同一 Session ID。

Session 識別機制回顧

  • 伺服器以 SessionID (GUID) 為 Key 存儲 Session 資料(InProc/StateServer/SQL/Redis)。
  • 客戶端透過 Cookie ASP.NET_SessionId 攜帶 SessionID。
  • Cookie 預設 Domain 為當前主機名(a.example.com),導致跨子域不共享。

解決方案:Global.asax Session_Start 重寫 Cookie Domain

protected void Session_Start(object sender, EventArgs e) {
    // 1. 獲取當前 SessionID
    var sessionId = Session.SessionID;

    // 2. 重寫 Cookie:同名、同值、Domain 設為父域
    var cookie = Response.Cookies["ASP.NET_SessionId"];
    cookie.Value = sessionId;
    cookie.Domain = ".example.com"; // 關鍵:前綴點號表示父域及所有子域
    cookie.Path = "/";              // 確保全站路徑可用
    // 可選:cookie.Secure = true; // 僅 HTTPS 傳輸
    // 可選:cookie.HttpOnly = true; // 防 XSS 竊取
    // 可選:cookie.SameSite = SameSiteMode.Lax; // CSRF 保護
}

驗證步驟

  1. 登入 a.example.com,開發者工具查看 Cookie:Domain 顯示 .example.com。
  2. 跳轉 b.example.com,請求 Header 自動攜帶 ASP.NET_SessionId。
  3. b.example.com 代碼讀取 Session["User"] 成功,實現共享。

分散式 Session 存儲(生產必備)

單機 InProc Session 無法跨伺服器共享,必須配置共用存儲:

<sessionState mode="SQLServer" 
    sqlConnectionString="Data Source=...;Initial Catalog=ASPState;..." 
    cookieless="false" timeout="20" />

子域間單點登入 (SSO) 擴展

  • 登入頁集中於 auth.example.com,驗證成功寫入共用 Domain Cookie(如 AuthToken)。
  • 各子域應用啟動時讀取 AuthToken,驗證有效性並建立本地 Session/Principal。
  • 登出時清除 AuthToken (Domain=.example.com) 並通知各子域清理本地 Session。

常見問題排查

現象原因解決
子域仍各自生成新 SessionCookie Domain 未生效/拼寫錯誤檢查 Response.Cookies["ASP.NET_SessionId"].Domain 輸出;確認瀏覽器接收
Session 資料不同步使用 InProc 模式改用 SQLServer/Redis/StateServer 模式
登出後仍可存取Cookie 未正確刪除設定 cookie.Expires = DateTime.Now.AddDays(-1); Domain=.example.com
Chrome 80+ SameSite 阻攔跨站請求不攜帶 Cookie設定 SameSite=Lax 或 None+Secure;確保 HTTPS

安全加固建議

  • HttpOnly:防止 JavaScript 竊取 Session Cookie。
  • Secure:僅 HTTPS 傳輸,防中間人攻擊。
  • SameSite=Lax:平衡 CSRF 保護與跨站導航體驗。
  • SessionID 重生成:登入成功後 Session.RegenerateID() 防 Session Fixation。
  • 子域隔離:若部分子域為不信任租戶,勿共用父域 Cookie,改用 Token 傳遞。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved