IdentityServer4之持久化很順手的事

Code綜藝圈發表於2021-02-24

前言

原計劃打算在春節期間多分享幾篇技術文章的,但到最後一篇也沒出,偷懶了嗎?算是吧,過程是這樣的:每次拿出電腦,在孩姥姥家的院子總有陽光沐浴,看不清螢幕,回屋又有點冷(在強行找理由),於是又帶著娃遛彎去啦。哪有那麼多理由,就是想偷個懶;不過後面幾天把計算機組成原理簡單過了過,後面整理整理再單獨給小夥伴分享吧。

這次接著IdentityServer4說,之前一直用記憶體資料進行測試演示,在正式專案中肯定是要存資料庫的(除非資料固定,用記憶體方式實現);接下來就用Demo實操的過程說說IdentityServer4的持久化。

正文

IdentityServer4已經對EF Core有很好的支援與封裝,用很少的程式碼就能實現資料持久化,重點還是需要對EF Core有所瞭解,如果還有不瞭解的小夥伴,請先花幾分鐘看看之前分享的關於EF Core的文章(跟我一起學.NetCore之EF Core 實戰入門,一看就會)。

主要需要nuget包如下:

  • IdentityServer4:這個包是IdentityServer4的核心包,專案中只要使用IdentityServer4,就必須引入此包;
  • IdentityServer4.EntityFramework:這個包是IdentityServer4針對EF進行封裝的包,支援使用EF進行資料的持久化;
  • Microsoft.EntityFrameworkCore.SqlServer:針對不同的資料庫引入不同的EF包,這裡使用的是微軟提供的本地資料庫,所以引入的SqlServer;
  • Microsoft.EntityFrameworkCore.Tools:如果需要在程式的包管理控制檯進行遷移操作,就需要在指定程式集中安裝此包;
  • Microsoft.EntityFrameworkCore.Design:如果需要在命令列中進行遷移操作,就需要在指定程式集中安裝此包;

注:Demo演示採用的是包管理控制檯的方式進行遷移操作;命令列的方式思路是一樣的,只是使用的命令稍微有點不同;

Demo走起來

  1. 專案準備

    這裡就不從頭到尾敲程式碼啦,把上一節Authorization Code的程式碼拷貝過來,重點還是關注持久化的過程(這個理由棒棒噠)。

    原始碼地址:https://github.com/zyq025/IDS4Demo/tree/main/AuthorizationCode。

  2. 開始擼碼

    先把包都引入到程式中,如下圖:

    然後在Startup.cs檔案中,將原來的記憶體模式改為從資料庫中讀取即可;其實最關鍵的就是IdentityServer4封裝好的兩個上下文:

    • ConfigurationDbContext:這個上下文主要是針對配置資料,比如客戶端(Client)、資源(Resources)等;
    • PersistedGrantDbContext:這個上下文主要是針對使用者授權操作時的資料和臨時資料,比如同意授權的資料、Token等;

    在程式碼中只需要針對這這兩個上下文指定資料庫就行啦,如果沒有什麼自定義需求,不用其他配置,如下:

  3. 遷移就完事啦

    程式碼擼完啦,剩下的就是EF遷移的幾步走就完事啦(這裡演示用的包管理控制檯):

    注: 如果程式中有多個上下文,如果不指定上下文,遷移會報錯,因為程式不知要到遷移哪個。

    • 新增遷移

      指定ConfigurationDbContext

      指定PersistedGrantDbContext

      引數簡要說明:

      -Context : 指定上下文進行遷移;

      -OutputDir:遷移生成的檔案存放路徑;

      最後遷移的檔案結果如下:

    • 根據遷移檔案,同步到資料庫中

      先同步ConfigurationDbContext

      這時候對應的資料庫就生成了,而且對應配置相關的表已經在資料庫建立:

      再同步PersistedGrantDbContext

      這個表少,就兩張:

    其實這樣就已經可以啦,只要在資料庫對應的表中新增對應的資料,就能進行操作啦; 那新手小夥伴肯定得苦惱啦,這麼多表,咋知道哪個表存啥資料啊;不急,我們們把原來記憶體中的資料存進去,然後再看看每個表存了啥,這不就更加明瞭啦,比一個一個表說的還直接,這種方式還能促使小夥伴動手,不然都不知道里面存了啥(哈哈哈,高招)。那就多出來第四步,如下......

  4. 加個種子資料美美噠

    這裡說的種子資料就是指原來在記憶體中資料,把它們讀出來存到資料庫中就行;很簡單,通過上文對應直接存即可,程式碼如下:

    方法寫好啦,直接在Configure中呼叫即可,如下:

    這樣就完工啦,把授權伺服器、資源伺服器、客戶端都啟動,走一遍流程,看看是不是成功啦,不出意外一切順利,這時再返過來看看每個表中都存啥資料,就真的很清晰啦。這裡就不一一截圖說,相信小夥伴都能搞得明白。

到這肯定有小夥伴要說話啦,使用者那還是用的記憶體;之所以沒放到上面一起說,那是因為使用者這塊的控制權完全在我們自己手裡,可以自己設計(就是使用者、選單、角色那一套),也可以整合微軟封裝好的Identity(把常用的使用者那一套已經封裝啦)。

這裡演示肯定挑著爽的玩,就整合微軟封裝好的Identity,來,繼續擼碼:

  1. 引入相關nuget包

    引入的包簡單說明

    IdentityServer4.AspNetIdentity:IdentityServer4對微軟封裝的Indentity的支援;

    Microsoft.AspNetCore.Identity.EntityFrameworkCore:對Identity提供EF支援;

  2. 擼碼就對啦

    因為IdentityDbContext是抽象類,不能直接使用,這裡需要針對IdentityDbContext定義一個子類ApplicationDbContext,如下:

    然後在Startup.cs中註冊相關服務即可:

  3. 遷移及同步:這裡沒有指定輸出路徑,小夥伴根據自己的需要進行指定。

    資料庫中生成相關的表,如下:

  4. 更改登入和登出邏輯

    登出的時呼叫 _signInManager.SignOutAsync();即可

  5. 加點種子資料,即程式啟動時加入使用者資料

    方法寫好,同樣在Configure中呼叫即可,種子資料準備好之後,就可以用Zoe使用者進行登入啦,密碼就是Zoe123456&

這裡就不專門針對微軟封裝的Identity說的那麼細啦,小夥伴可以參考文件:https://docs.microsoft.com/zh-cn/aspnet/identity/overview/getting-started/introduction-to-aspnet-identity。

總結

IdentityServer4的入門暫時先到這篇吧,後續會在實戰專案中進行使用分享。下一節先來說說服務發現。

一個被程式搞醜的帥小夥,關注"Code綜藝圈",跟我一起學~

相關文章