目錄
在Asp.Net架構中提供了幾種身份驗證方式:
Windows身份驗證、
Forms身份驗證、passport身份驗證(單點登入驗證)。
每種驗證方式都有适合它的場景:
-
通常用于企業内部環境,Windowss身份驗證
就是基于windows平台的身份驗證實作;Windows Active Directory
-
是Asp.Net架構中提出的另一種驗證方式;Forms身份驗證
-
是微軟提供的基于自己的lives賬号實作的單點認證服務。passport身份驗證
這種方式可能是在Asp.Net架構提供的幾種驗證方式之外的最常用的身份驗證方式。
實作原理
- 用戶端發送身份認證資料到伺服器端
- 伺服器收到并驗證後将使用者資訊儲存到Session對象中,然後生成對應的辨別并将辨別寫入cookie中
- 當用戶端下次請求時帶上該cookie辨別
- 伺服器通過該cookie辨別從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洗洗睡吧!