iT邦幫忙

第 12 屆 iT 邦幫忙鐵人賽

DAY 21
0
Modern Web

我與 ASP.NET Core 的 30天系列 第 21

[Day21] Cookie與Session - 我與 ASP.NET Core 3 的 30天

HTTP 是無狀態的通訊協定,但是在網路應用程式中,有許多東西是需要被記錄作為狀態的,例如:登入狀態...等。
為了解決這個問題,會需要有暫存保留資料的機制。Cookie與Session就是其中常用到的方式。

Cookie

Cookie是存於用戶端(瀏覽器)的小型文字檔案,以key/value的形式記錄使用者某些操作上的資訊,並隨著發出Request一同送出,可以用來描述 client 與 server目前溝通狀態。而由於會隨著每個Request發出,所以cookie也應該保持在最小值的情況,通常以存入識別碼為主。

Session

Session是在伺服器端的儲存機制,通常用於儲存使用者相關的資訊,且會產生相對應的SessionId存入cookie作為辨識。

ASP.NET Core 中使用Cookie

前面幾天的文章其實都有小提到Cookie的設定方式,這邊就來整理一下在ASP.NET Core中,從伺服器端發送到用戶端的Cookies的設定方式

在Action中設定Cookie

public IActionResult Index()
{
    ...
    HttpContext.Response.Cookies.Append("CookieKey", "CookieValue");
    ...
}

在Middleware中設定Cookie

Startup.Configure中加入下方的Middleware pipeline

app.Use(async(context, next) => 
{
    context.Response.Cookies.Append("CookieKey", "CookieValue");
    await next.Invoke();
});

可以到我們設定的Cookie如下
https://ithelp.ithome.com.tw/upload/images/20201005/20129389GkiL2NittY.png

Cookies.Append還提供方法多載來設定Cookie的選項,透過CookieOptions()來加入Cookie的設定選項

context.Response.Cookies.Append("CookieKey", "CookieValue", new CookieOptions() { HttpOnly = false });

CookieOptions()提供了下列屬性可供設定

  • Domain
    設定允許接受此Cookie的 hosts。若無註明,則預設給當前文件位置的host
  • Expires
    設定此Cookie的到期時間
  • HttpOnly
    設定此Cookie是否可以透過client端腳本發送
  • IsEssential
    設定此Cookie是否對應用程式為必要
  • MaxAge
    設定此Cookie最大使用期限
  • Path
    設定此Cookie的path
  • SameSite
    設定此Cookie的SameSite屬性 (SameSite是用來設定對於不同來源Cookie的限制)
  • Secure
    設定此Cookie是否僅能使用HTTPS做傳輸

ASP.NET Core 中使用Seesion

Startup.ConfigureServices中設定使用內存記憶體來記錄Session,並在DI容器中加入Session服務

services.AddDistributedMemoryCache();
services.AddSession();

並在Startup.Configure中加入Session的pipe line,並設置一個Session

app.UseSession();
app.Use(async (context, next) =>
{
    context.Session.SetString("SessionKey","SessoinValue");
    await next.Invoke();
});

可以看到Response Cookies有多了一個key為.AspNetCore.Session的Cookie,而這個就是用來識別Session的唯一值。
https://ithelp.ithome.com.tw/upload/images/20201005/20129389f7T7HtT9cB.png
Request送出並帶上這個Cookie,Session容器就會取得這個Cookie,並找出對應的資料。

在設置Seesion的服務時,還可以針對Session去做詳細的設定

services.AddSession(options =>
{
    options.Cookie.Name = ".AdventureWorks.Session";
    options.IdleTimeout = TimeSpan.FromSeconds(10);
    options.Cookie.SecurePolicy = CookieSecurePolicy.Always;
});

Session服務提供下列三個項目可作設定:

  • Cookie
    用來設定Response Cookie的細節,範例中就是透過Cookie.Name來設置Response Cookie的名稱,也可以透過Cookie.SecurePolicy或是Cookie.SameSite...等等安全性設置來加強Cookie的安全性
  • IdleTimeout
    是用來設定Session過期的時間,多久之後沒有透過Request刷新才會放棄它的內容。預設為20分鐘
  • IOTimeout
    用來設定從存放區載入Session,或將它認可回到存放區時,所允許的時間長度上限。

參考資料
Session and state management in ASP.NET Core


上一篇
[Day20] 跨網站偽造要求 (XSRF/CSRF) 攻擊 - 我與 ASP.NET Core 3 的 30天
下一篇
[Day22] 身份驗證與授權 - 我與 ASP.NET Core 3 的 30天
系列文
我與 ASP.NET Core 的 30天31

尚未有邦友留言

立即登入留言