天天看點

AspNetCore中基于Session的身份驗證AspNetCore中基于Session的身份驗證

目錄

在Asp.Net架構中提供了幾種身份驗證方式:

Windows身份驗證

Forms身份驗證

、passport身份驗證(單點登入驗證)。

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

  1. Windowss身份驗證

    通常用于企業内部環境,

    Windows Active Directory

    就是基于windows平台的身份驗證實作;
  2. Forms身份驗證

    是Asp.Net架構中提出的另一種驗證方式;
  3. passport身份驗證

    是微軟提供的基于自己的lives賬号實作的單點認證服務。

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

實作原理

  1. 用戶端發送身份認證資料到伺服器端
  2. 伺服器收到并驗證後将使用者資訊儲存到Session對象中,然後生成對應的辨別并将辨別寫入cookie中
  3. 當用戶端下次請求時帶上該cookie辨別
  4. 伺服器通過該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洗洗睡吧!

繼續閱讀