本篇文章是基于ASP.NET CORE 5.0以及IdentityServer4的IdentityServer搭建,為什么要從零搭建呢?IdentityServer4本身就有很多模板可以直接生成一個可以運行的驗證服務程式,是因為在真實開發程序中很難直接用生成的模板來進行開發,其次是通過生成的方式開發者本身可能會對某些技術細節有所忽略, 本文從以下幾個方面來完成IdentityServer專案搭建:
- 創建一個空的Asp.net Core 5.0專案
- 添加IdentityServer4
- IdentityServer4資料持久化
- 配置IdentityServer4證書
- 創建一個基于Jwt身份驗證的WebApi專案
- 小結
創建一個空的Asp.net Core 5.0專案
通過VS創建一個空的Asp.net core 5.0專案:
添加IdentityServer4組件
IdentityServer4是一組中間件,它實作了OpenID Connect和Oauth2.0協議,來提供身份驗證以及授權服務,添加IdentityServer4僅需要安裝IdentityServer4組件,然后對相關服務和中間件進行配置即可:
安裝完成后通過AddIdentityServer方法將相關的服務注冊到容器中,同時這里回傳一個builder用于繼續構建IdentityServer服務,如存盤、快取、加密相關的密鑰等等;


注:在添加中間件的時候需要注意IdentityServer中間件的放置順序,另外在呼叫UseIdentityServer這個方法中還自動添加了身份驗證的中間件,
IdentityServer4資料持久化
按理來說現在已經可以運行專案了,但是運行的時候出現了無法決議IClientStore型別錯誤:
這個問題的原因在于,IdentityServer4在進行授權時實際上是依賴一系列資料的,這些資料包括Client、Resource、Scope等,所以為了保證授權相關操作能夠完成,需要配置相關資料的存盤服務,IdentityServer4默認提供了測驗基于記憶體的資料存盤,但一般只是用于測驗目的:
關于資料持久化,在.net技術堆疊中可以想到的就是Entity Framework,同時IdentityServer4提供了名為:IdentityServer4.EntityFramework的包,它包含了相關的物體型別(IdentityServer4.EntityFramework.Storage)以及EF的DbContext,所以引入IdentityServer4.EntityFramework包就可以實作基于EF的資料持久化,另外也可以自己實作,

上圖中可以看到IdentityServer4關于EF的包有2個,但是實際上安裝IdentityServer4.EntityFramework就包含Storage這個包了:

安裝完成之后,我們可以在IdentityServer4.EntityFramework.Storage包中找到以下兩個DbContext型別:
ConfigurationDbContext : PersistedGrantDbContext :
為了EF能夠正常作業需要根據資料庫型別安裝相應的EF資料庫提供器(本例使用的是Mariadb):
然后就可以對IdentityServer的存盤進行配置了:

以上主要是對資料庫鏈接字串、資料庫版本、字符集以及資料庫遷移程式集進行配置,需要注意的是在對資料庫進行遷移的時候默認使用DbContext所在的程式集,而IdentityServer4提供的DbContext位于IdentityServer4.EntityFramework.Storage包里面,所以為了能夠確保遷移檔案正常生成,所以需要將Startup所在的程式集設為遷移程式集(注:更適合的方式是專門創建一個資料庫遷移專案來作為遷移程式集,這樣資料庫遷移的相關內容可以單獨維護),
另外還需要注意的是資料庫鏈接字串,在開發時可能資料庫安裝在本地可以使用127.0.0.1,但是如果在dorcker中除錯的話127.0.0.1無法鏈接到資料庫, 完成配置后即可將資料庫結構遷移到資料庫中,首先需要安裝EF的工具:
工具描述,相關命令及引數可參考檔案https://docs.microsoft.com/en-us/ef/core/cli/powershell:
注:-c和-o分別是-Context 和-OutputDir 的簡寫,在引數沒有二義性時可以使用簡寫,
生成的檔案:
執行資料庫更新命令后,資料庫將完成創建:
Update-Database -Context PersistedGrantDbContext Update-Database -Context ConfigurationDbContext
資料庫也就創建好了:

啟動程式,并訪問https://localhost:55006/.well-known/openid-configuration即可看到以下內容,證明IdentityServer4已經成功啟動了:

注:關于IdentityServer4的默認資料可通過命令“dotnet new -i IdentityServer4.Templates”先安裝IdentityServer4相關模板,然后使用“dotnet new is4ef”命令來創建,具體參考檔案:https://identityserver4.readthedocs.io/en/latest/quickstarts/5_entityframework.html
在啟動引數中包含“/seed”時創建資料,關于啟動引數,可以直接執行程式時添加,如dotnet .\IdentityServer.dll /seed,或者通過VS中設定除錯引數進行除錯(資料生成后洗掉):
配置IdentityServer4證書
運行程式,通過測驗資料中的client及其密碼嘗試獲取access token:

添加代碼后再次運行程式,就能夠生成Access Token 了:

創建一個基于Jwt身份驗證的WebApi專案
設定API的授權訪問:

成功訪問,但是這里有個小細節需要注意一下,就是當獲取到access token后,在token的有效期內,哪怕是把IdentityServer關閉,也能使用token正常訪問受保護資源,換句話說access token頒發后就與IdentityServer無關了,以上內容實際上是使用Asp.Net core 5.0以及IdentityServer4實作了一個基于客戶端證書(Client Credentials)的Oauth2.0授權流程,但IdentityServer提供的內容不僅于此,后續文章將會對該IdentityServer繼續完善,使其成為一個功能完善的身份驗證服務,
小結
本篇文章從一個空專案開始,不斷往里面添加組件和代碼,搭建了一個基于IdentityServer4的身份驗證服務器,并且到目前為止已經實作了IdentityServer4的相關資料持久化,并且能夠通過Client_Credentials等方式獲取Access Token,實作了基于Jwt的身份驗證,這一切實際上都是基于Oauth2.0協議的,關于Oauth2.0可以參考文章:https://www.cnblogs.com/selimsong/p/8037717.html 但IdentityServer4是一個實作OpenIDConnect協議的身份驗證/授權服務,更多內容將在后續文章中介紹, 參考: https://github.com/PomeloFoundation/Pomelo.EntityFrameworkCore.MySql/wiki/Configuration-Options https://docs.microsoft.com/en-us/ef/core/cli/powershell https://identityserver4.readthedocs.io/en/latest/轉載請註明出處,本文鏈接:https://www.uj5u.com/net/253313.html
標籤:.NET Core
