上一篇我們成功建立了 JWT 與 Swagger,而在進入 Session 實作前先來簡單介紹一下什麼是 Session ? 在專案內的功用為何?為什麼需要使用它?

在呼叫 API 時,每次的呼叫都是獨立的,並不會記得前幾次是做了什麼呼叫,也不會記得呼叫的 Client 的狀態或者使用者為誰,而 Session 可以把我們給予它的資料儲存在 Server 的記憶體內,以利下次方便取用,那 Server 要怎麼把正確的資料給予對應的 Client?對應的大致流程如下:

(1) Client 呼叫 API 時會攜帶該網域下的 Cookies。

(2) Server 接收到並使用 Key為 SessionID 的 Cookie,使用 Cookie 的 Value 來 SessionPoo l中查找屬於使用者的Session (如果是第一次請求或是沒有 SessionID 會在產生一個新的並加入回應的Cookie中)。

(3) 取得 Session 物件後就可以專案中使用。

而我們會在 JWT 驗證成功將 JWT 內的有效資訊放入 Session 內,以利將來方便取得一些基本資訊,我們需要先去註冊 Session 並且建立好儲存格式(也可以讀取單一字串),

(1) 在 Startup 中的 ConfigureServices 註冊 AddSession 和 Configure 引用 UseSession。

(2) 建立 SessionProvider.cs 檔案(可以自行決定放在哪一個資料夾內,這裡示範是放在Provider資料夾內),在 SessionProvider 內注入 IHttpContextAccessor 與上一篇實作IConfiguration 的注入方式一樣,在 Startup 內建立 HttpContextAccessor 後,還需要在 Startup 中的 ConfigureServices 註冊 AddHttpContextAccessor 以利稍後 JwtProvider 使用。

(3) 建立一個使用者資訊的 Model,當做 Session 的儲存格式。

(4) 以剛產生的 UserInfoDto 做為儲存格式,建立GET/SET 函式。

SessionProvider 處理好後就可在驗證成功時,解析 JWT 取得相關資訊,先在 JwtProvider 建立函式,並且在 Startup 中的 ConfigureServices 驗證服務中,新增 Events (OnTokenValidated)動作來呼叫解析 JWT 函式。

儲存好 Session,那要怎麼取用 Session 呢 ? 我們先在 Controller 內注入 SessionProvider,並且建立一函式呼叫 SessionProvider 內的函式來取得資訊。

啟用Swagger後,我們呼叫 API 會得到下列錯誤:

System.InvalidOperationException: Unable to resolve service for type 'TESTAPI.Provider.SessionProvider' while attempting to activate 'TESTAPI.Controllers.LoginController'.

是的!前篇文章遇過一樣的問題,但總不能每當需要注入時就要去 Startup 註冊一次服務,這樣太耗費時間與精力,所以這時候就需要去 NuGet (如圖u一)搜尋 Autofac 與Autofac.Extensions.Dependencyinjection 並且安裝至專案,在 Program 上加入此服務後,也要去 Startup 上設定要自動注入的檔案,我們拿 SessionProvider 為例,取得所有結尾以Provider為名稱的檔案,注入到專案中。

圖一 NuGet

啟用 Swagger (圖二)後,呼叫 API 即可獲得剛剛在 Session 中的 Id 囉!

圖二 Swagger

Session 的存取應用到這裡就結束了,接下來下一篇會提到 Middleware 統一回傳格式與 Middleware 的應用為何?我們下一篇見~

--

--