[C#.NET][ASP.NET] 存取 Cookie

[C#.NET][ASP.NET] 存取 Cookie

Cookie 是瀏覽器與伺服器進行資料交換的方式,它存在於用戶電腦,用於保存網頁狀態,參考

ASP.NET 狀態管理概觀

ASP.NET 狀態管理建議事項

 

使用 Cookie的背景及限制

https://msdn.microsoft.com/zh-tw/library/ms178194%28v=vs.100%29.aspx#Background

  1. 大部分 Browser 支援最多 4096 bytes 的 Cookie (個人習慣控制在 4000 bytes 以下)
  2. Browser 也會限制網站 Cookie數量
  3. 若使用者限制存取 Cookie ( 個人習慣:Session 跟 Cookie 相依,為了不讓 Session ID 曝露在 Url,所以使用者若限制存取 Cookie,就不要讓他使用服務)
  4. Browser 的 Cookie 限制,超過 Browser 的限制,則會拋棄舊的,可以下網站測試 Cookie 的限制
    http://browsercookielimits.squawky.net/

 

Cookie 的屬性

  1. Value:只能存放字串,若需要存放物件(DTO),可使用 Json.NET 序列化字串;存放時需先使用編碼(可使用 HttpUtility.UrlEncode|HttpContext.Current.Server.UrlEncode),取出則解碼 (可使用 HttpUtility.UrlDecode|HttpContext.Current.Server.UrlDecode),
  2. Domain:限定特定網域存取,只有該網域能存取 (localhost 無效),若不指定,則會寫入當前網域
  3. Path:預設,相同網域的所有網頁會共用 Cookie;若設定特定位置(可設定虛擬目錄或是檔案路徑,有分大小寫),就能限制讀取
  4. Expires:若不指定到期時間,Browser 關掉就會清掉,Cookie 就不會保存在用戶端電腦上
  5. HttpOnly:設定true,只能給 http 使用,false 可以給JavaScript 使用,為了避免駭客偷 Cookie,會將它設為true
  6. Secure:是否透過 SSL 連線,但存放在 Browser 的資料仍是明碼;若設定true,當網址使用 https:// Browser 才會去 Cookie 存放區拿資料

 

情境:我想要驗証 Path 是否如我預期工作

  1. 有兩個頁面,Main.aspx、Sub.aspx
  2. 在 Main.aspx 寫入Cookie
  3. Main.aspx,可以看到 Share_Cookie 和 Main_Cookie
  4. Sub.aspx,可以看到 Share_Cookie 和 Sub_Cookie

 

核心片斷程式碼

{
    SetCookieData(new Info() { Name = s_ShareName, Path = "/Login", Data = "共用 資料", Id = Guid.NewGuid(), Stamp = DateTime.Now });
    SetCookieData(new Info() { Name = s_MainName, Path = "/Login/Main.aspx", Data = "@main.aspx", Id = Guid.NewGuid(), Stamp = DateTime.Now });
    SetCookieData(new Info() { Name = s_SubName, Path = "/Login/Sub.aspx", Data = "@sub.aspx", Id = Guid.NewGuid(), Stamp = DateTime.Now });
}

private static void SetCookieData(Info info)
{
    var cookie = HttpContext.Current.Request.Cookies[info.Name] ?? new HttpCookie(info.Name);
    cookie.HttpOnly = true;
    cookie.Path = info.Path;
    var json = JsonConvert.SerializeObject(info);
    cookie.Value = HttpContext.Current.Server.UrlEncode(json);
    HttpContext.Current.Response.Cookies.Add(cookie);
}

 

完整程式碼如下

https://dotblogsamples.codeplex.com/SourceControl/latest#Simple.OperCookie/Simple.OperCookie/Core.cs

 

存放 Cookie

Request Header

當我在 Main.aspx 寫入Cookie 時,也就是調用 HttpContext.Current.Response.Cookies.Add(cookie),Http Request 也會有該 Cookie,也就是 HttpContext.Current.Request.Cookies 也會擁有該 Cookie。

PS.因為網頁生命週期的關係,我目前在 Main.aspx,所以不會有 Sub_Cookie,若沒有控制好就會在 HttpContext.Current.Request.Cookies 看到不該存在的 Cookie

Response Header

Browser 收到 Set Cookie 命令後把 Cookie 存下來

image

 

讀取 Cookie

當我重新瀏覽 Main.aspx 時,Browser 會去找 Cookie 存放區有沒有符合Domain、Path、Expires、Secure,若有的話就會包在 Http Request 的 Cookie Header,當我調用 HttpContext.Current.Request.Cookies 就可以拿到所有的 Cookie

image

 

當我瀏覽 Sub.aspx 時

 

 

image

 

刪除 Cookie

由於我們不能直接控制 Browser 的 Cookie,可以設定 Cookie 的 Expires 過期,它就等於刪掉的意思

{
    var cookie = HttpContext.Current.Request.Cookies[cookieName] ?? new HttpCookie(cookieName);
    cookie.Expires = DateTime.Now.AddDays(-1);
    cookie.Path = path;
    HttpContext.Current.Response.Cookies.Add(cookie);
}


 

操作畫面如下:

Untitled

 


文章出自:http://www.dotblogs.com.tw/yc421206/archive/2015/04/09/150998.aspx

專案位置:https://dotblogsamples.codeplex.com/SourceControl/latest#Simple.OperCookie/

 

若有謬誤,煩請告知,新手發帖請多包涵


Microsoft MVP Award 2010~2017 C# 第四季
Microsoft MVP Award 2018~2022 .NET

Image result for microsoft+mvp+logo