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洗洗睡吧!