AspNetCore中基於Session的身份驗證
目錄
-
AspNetCore中基於Session的身份驗證
- 基於Session的身份驗證實現
- Asp.Net Core中的Session身份認證實現
AspNetCore中基於Session的身份驗證
在Asp.Net框架中提供了幾種身份驗證方式:Windows身份驗證、Forms身份驗證、passport身份驗證(單點登入驗證)。
每種驗證方式都有適合它的場景:
-
Windowss身份驗證
通常用於企業內部環境,Windows Active Directory
就是基於windows平臺的身份驗證實現; -
Forms身份驗證
是Asp.Net框架中提出的另一種驗證方式; -
passport身份驗證
是微軟提供的基於自己的lives賬號實現的單點認證服務。
基於Session的身份驗證實現
這種方式可能是在Asp.Net框架提供的幾種驗證方式之外的最常用的身份驗證方式。
實現原理
- 客戶端傳送身份認證資料到伺服器端
- 伺服器收到並驗證後將使用者資訊儲存到Session物件中,然後生成對應的標識並將標識寫入cookie中
- 當客戶端下次請求時帶上該cookie標識
- 伺服器通過該cookie標識從session物件中獲取對應的使用者資訊
Asp.Net Core中的Session身份認證實現
基於Session的身份認證並不是Asp.Net Core中推薦的認證方式,因為Asp.Net Core中有更高階的Forms身份認證方式,不過在這裡不是本文章的主題,我們只講如何在Asp.Net Core中實現基於Session的身份認證。
我們先建立一個用於程式碼演示的基礎專案
dotnet new razor -n SessionSample
在startup.cs
中啟用session功能
public class Startup { public void ConfigureServices(IServiceCollection services) { ... //新增session服務 services.AddSession(); } public void Configure(IApplicationBuilder app, IHostingEnvironment env) { ... //啟用session app.UseSession(); app.UseMvc(); } }
建立一個MyPage.cs
檔案,我們在該類中實現了一個IsLogin
屬性,該屬性用來判斷使用者的登陸狀態:
public class MyPage:PageModel { protected bool IsLogin { get { string userId = null; //從sessin中獲取UserId對應的使用者資訊來判斷使用者是否登陸 if (HttpContext.Session.TryGetValue("UserId", out byte[] bytes)) { userId = Encoding.UTF8.GetString(bytes); } return !string.IsNullOrWhiteSpace(userId); } } }
我們已經實現了驗證,現在缺少的是如何在session中新增UserId
的資訊,我們來建立一個Login頁面
:
dotnet new page -n Login
public class LoginModel : MyPage { public void OnGet() { if(IsLogin) { //如果已經登陸就跳轉到/Index頁面 RedirectToPage("/Index"); } } public IActionResult OnPost() { //這裡我們將UserId寫入session中 HttpContext.Session.SetString("UserId", Guid.NewGuid().ToString()); return RedirectToPage("/Index"); } }
給現有的頁面新增驗證功能,開啟Index頁面
,新增如下程式碼:
public class IndexModel : MyPage { public IActionResult OnGet() { if (!IsLogin) { return RedirectToPage("/Login"); } return Page(); } }
OK!我們已經實現了身份認證。
原始碼
總結
我們描述了傳統Asp.Net中提供的幾種身份認證方式,並在Asp.Net Core實現了一種雖然不標準但是常用的身份認證機,看起了與Asp.Net中的用法並沒有什麼區別。
在Asp.Net Core中這種用法似乎並不受歡迎,可能是因為Asp.Net Core提供了更高階的身份驗證機制吧,那麼這篇文章存在的意義呢?權當做是對Asp.Net的一種紀念吧!
現在是.net core的時代,讓.net洗洗睡吧!