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

ASP.NET Cookie 完整操作指南:寫入、讀取、修改、刪除、多值、跨子域

     編輯:ASP.NET 基礎

Cookie 基礎知識

  • 大小限制:單一 Cookie ≤ 4 KB(含名稱、值、屬性)。
  • 數量限制:每域名約 50~180 個(瀏覽器不同)。
  • 同源策略:瀏覽器自動附帶同域 Cookie 於請求標頭。
  • 安全屬性:HttpOnly(防 XSS)、Secure(僅 HTTPS)、SameSite(防 CSRF)。

1. 寫入 Cookie(單值)

// 方式一:Response.Cookies 集合(簡潔)
Response.Cookies["username"].Value = "mike";
Response.Cookies["username"].Expires = DateTime.Now.AddDays(30); // 持久化 30 天
Response.Cookies["username"].HttpOnly = true; // 防 JS 竊取
Response.Cookies["username"].Secure = true;   // 僅 HTTPS 傳輸(需站台支援)
Response.Cookies["username"].SameSite = SameSiteMode.Lax; // CSRF 保護

// 方式二:HttpCookie 物件(彈性較大)
var cookie = new HttpCookie("lastVisit", DateTime.Now.ToString("o"))
{
    Expires = DateTime.Now.AddDays(1),
    HttpOnly = true,
    Secure = Request.IsSecureConnection,
    SameSite = SameSiteMode.Strict
};
Response.Cookies.Add(cookie);

2. 寫入 Cookie(多值 / 子鍵)

單一 Cookie 可攜帶多組 Key-Value,節省 Cookie 數量配額。

// 方式一
Response.Cookies["userInfo"]["name"] = "mike";
Response.Cookies["userInfo"]["role"] = "admin";
Response.Cookies["userInfo"].Expires = DateTime.Now.AddDays(30);

// 方式二(推薦:集中設定屬性)
var cookie = new HttpCookie("userInfo")
{
    Expires = DateTime.Now.AddDays(30),
    HttpOnly = true,
    Secure = true,
    SameSite = SameSiteMode.Lax
};
cookie.Values["name"] = "mike";
cookie.Values["role"] = "admin";
Response.Cookies.Add(cookie);

3. 讀取 Cookie

// 單值
if (Request.Cookies["username"] is HttpCookie c1)
    string name = c1.Value; // 自動 URL 解碼

// 多值
if (Request.Cookies["userInfo"] is HttpCookie c2)
{
    string name = c2.Values["name"];
    string role = c2.Values["role"];
}

// 遍歷所有 Cookie
foreach (string key in Request.Cookies.AllKeys)
{
    var cookie = Request.Cookies[key];
    if (cookie.HasKeys)
    {
        foreach (string subKey in cookie.Values.AllKeys)
            Console.WriteLine($"{key}[{subKey}] = {cookie.Values[subKey]}");
    }
    else
        Console.WriteLine($"{key} = {cookie.Value}");
}

4. 修改 Cookie

修改即重新寫入同名 Cookie(覆蓋)。

// 修改單值
Response.Cookies["username"].Value = "newName";
Response.Cookies["username"].Expires = DateTime.Now.AddDays(30); // 重設過期時間

// 修改多值單一子鍵
var cookie = Request.Cookies["userInfo"];
if (cookie != null)
{
    cookie.Values["role"] = "superadmin";
    cookie.Expires = DateTime.Now.AddDays(30);
    Response.Cookies.Add(cookie);
}

5. 刪除 Cookie

將過期時間設為過去日期,瀏覽器即會移除。

// 刪除單一 Cookie
Response.Cookies["username"].Expires = DateTime.Now.AddDays(-1);

// 刪除多值 Cookie 中的特定子鍵
var cookie = Request.Cookies["userInfo"];
if (cookie != null)
{
    cookie.Values.Remove("role");
    if (cookie.Values.Count == 0)
        cookie.Expires = DateTime.Now.AddDays(-1); // 無子鍵則刪除整個 Cookie
    else
        cookie.Expires = DateTime.Now.AddDays(30); // 保留其他子鍵
    Response.Cookies.Add(cookie);
}

// 一次刪除所有 Cookie(登出場景)
foreach (string key in Request.Cookies.AllKeys)
{
    var c = Request.Cookies[key];
    c.Expires = DateTime.Now.AddDays(-1);
    Response.Cookies.Add(c);
}

6. 跨子域共享 Cookie

主域 example.com 下的 a.example.com、b.example.com 共享登入狀態。

var cookie = new HttpCookie("SSO_Token", tokenValue)
{
    Domain = ".example.com", // 前綴點號:包含所有子域
    Path = "/",              // 整個網站路徑
    Expires = DateTime.Now.AddHours(2),
    HttpOnly = true,
    Secure = true,
    SameSite = SameSiteMode.None // 跨站需求時設 None,必須搭配 Secure
};
Response.Cookies.Add(cookie);

注意: SameSite=None 僅在 .NET 4.7.2+ / .NET Core 2.1+ 可用,舊版需自行加入 Set-Cookie 標頭字串。

7. 安全性檢核清單

項目建議設定說明
HttpOnlytrue防止 JavaScript 讀取,緩解 XSS
Securetrue (HTTPS 站台)僅加密傳輸,防竊聽
SameSiteLax / Strict / NoneLax 兼顧體驗與安全;跨站嵌入需 None+Secure
Expires合理期限避免 Session Cookie 永久存活;敏感資料用短期
Domain最小必要域不要設 .com 等頂級域
Path/ 或特定應用路徑限制 Cookie 送達範圍

總結

Cookie 是無狀態 HTTP 中維持狀態的基石。掌握 HttpCookie 物件模型、多值結構、跨域共享與安全屬性,即可構建健壯的身份驗證、偏好設定、追蹤機制。現代專案建議搭配 ASP.NET Core Cookie Authentication 或 IdentityServer 等成熟框架,避免手動管理細節錯誤。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved