HttpOnly(防 XSS)、Secure(僅 HTTPS)、SameSite(防 CSRF)。// 方式一: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);
單一 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);
// 單值
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}");
}
修改即重新寫入同名 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);
}
將過期時間設為過去日期,瀏覽器即會移除。
// 刪除單一 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);
}
主域 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 標頭字串。
| 項目 | 建議設定 | 說明 |
|---|---|---|
| HttpOnly | true | 防止 JavaScript 讀取,緩解 XSS |
| Secure | true (HTTPS 站台) | 僅加密傳輸,防竊聽 |
| SameSite | Lax / Strict / None | Lax 兼顧體驗與安全;跨站嵌入需 None+Secure |
| Expires | 合理期限 | 避免 Session Cookie 永久存活;敏感資料用短期 |
| Domain | 最小必要域 | 不要設 .com 等頂級域 |
| Path | / 或特定應用路徑 | 限制 Cookie 送達範圍 |
Cookie 是無狀態 HTTP 中維持狀態的基石。掌握 HttpCookie 物件模型、多值結構、跨域共享與安全屬性,即可構建健壯的身份驗證、偏好設定、追蹤機制。現代專案建議搭配 ASP.NET Core Cookie Authentication 或 IdentityServer 等成熟框架,避免手動管理細節錯誤。