AspNetCore中基於Session的身份驗證


AspNetCore中基於Session的身份驗證

在Asp.Net框架中提供了幾種身份驗證方式:Windows身份驗證Forms身份驗證、passport身份驗證(單點登錄驗證)。

每種驗證方式都有適合它的場景:

  1. Windowss身份驗證通常用於企業內部環境,Windows Active Directory就是基於windows平台的身份驗證實現;
  2. Forms身份驗證是Asp.Net框架中提出的另一種驗證方式;
  3. passport身份驗證是微軟提供的基於自己的lives賬號實現的單點認證服務。

基於Session的身份驗證實現

​ 這種方式可能是在Asp.Net框架提供的幾種驗證方式之外的最常用的身份驗證方式。

實現原理

  1. 客戶端發送身份認證數據到服務器端
  2. 服務器收到並驗證后將用戶信息保存到Session對象中,然后生成對應的標識並將標識寫入cookie中
  3. 當客戶端下次請求時帶上該cookie標識
  4. 服務器通過該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洗洗睡吧!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM