前面的文章使用Asp.net core 5.0以及IdentityServer4搭建了一個基礎的驗證服務器,并實作了基于客戶端證書的Oauth2.0授權流程,以及通過access token訪問被保護資源,本文將繼續完善IdentityServer實作與Identity組件的集成,可使用Identity的用戶來完成授權,
- 集成Asp.net core Identity與元包(MetaPackage)
- Asp.net core Identity資料持久化
- Asp.net core Identity UI
- Asp.net core Identity與IdentityServer4集成
- 小結
集成Asp.net core Identity
在軟體領域中只要提到身份驗證就能想到登錄,而登錄往往與用戶名和密碼相關聯,IdentityServer4或者說OAuth2.0和OpenIDConnect也是一樣的,它需要用戶資料來支持完成相關的驗證及授權操作,下面我們就先來實作IdentityServer4的用戶資料接入及與用戶資料相關的授權流程,
首先為IdentityServer添加Asp.Net core Identity模塊:
Asp.net core Identity是Asp.net core的身份驗證組件,它不僅包含了身份驗證所需的資料及資料持久化支持,另外還提供了用戶管理、登錄管理等一系列的服務和UI,在創建新的Asp.net core mvc或api專案時,如果勾選身份驗證選項就會默認包含該組件,但是由于文本中的例子是從零開始的,所以Identity組件也需要手動添加,
在添加Identity之前還有一個概念需要再說一下就是metapackege(元包,具體參考:https://natemcmaster.com/blog/2018/08/29/netcore-primitives-2/),它實質上是一組共享庫,提供了.net core和asp.net core應用的基礎運行時和基礎功能,在創建專案時默認會依賴相應.net core版本的元包,而元包共享的程式集實際上在dotnet的安裝目錄的shared目錄下,元包的好處就是在框架發布時,發布檔案就不需要包含元包內容,減少發布檔案大小:

而Asp.net core 5.0應用程式包含兩個元包:

其中Microsoft.AspNetCore.App中包含了Identity的基礎組件:

基礎組件中已經包含了Identity的基礎組件,如IdentityUser等相關的物體以及相關的服務型別/介面,所以換句話說使用Identity功能僅需要完成資料持久化及UI即可,

Asp.net core Identity資料持久化
EF core是.net core下面的首選資料持久化框架,所以同樣的identity也提供了基于EF core的資料持久化組件,添加基于EF的Identity資料持久化組件:

同時為了方便后續的擴展,新建一個ApplicationUser繼承于IdentityUser和ApplicationDbContext繼承于IdentityDbContext<ApplicationUser>:

添加Identity的資料背景關系及identity服務:

添加資料庫遷移代碼并更新到資料庫:
Add-Migration initIdentityDb -c ApplicationDbContext -o Migrations/IdentityServer/IdentityDb
Update-Database -Context ApplicationDbContext

Asp.net core Identity UI
Identity的UI是一個Razor的類別庫,換句話說就是頁面檔案被包含在類別庫里面了,如果要對UI進行修改可以通過VS的構建程式構建(VS Code可參考檔案:https://docs.microsoft.com/en-us/aspnet/core/security/authentication/scaffold-identity?view=aspnetcore-5.0&tabs=netcore-cli#scaffold-identity-into-an-empty-project):

在對話框中選擇“標識(Identity)”中的“標識(Identity)”選項:

在標識對話框中勾選“替代所有檔案”,布局檔案沒有留空即可,最后選擇Identity的DbContext即可:

添加Razor服務、靜態檔案處理中間件(訪問js等檔案)及Razor終結點映射:

訪問登錄地址:https://localhost:55002/Identity/Account/Login

到目前為止identity的資料庫和UI都已經添加到專案中并且可以運行了,但是還存在一些問題,如默認的Identity UI相關功能依賴IEmailSender組件等等,同時還需要與IdentityServer4集成,其登錄、注冊、登出等基礎功能需要根據IdentityServer4本身的一些需求進行修改,
Asp.net core Identity與IdentityServer4集成
下面就進入IdentityServer4與Asp.net core Identity的集成作業,首先先添加IdentityServer4.AspNetIdentity組件:

然后通過IIdentityBuilder向容器中添加相關服務:

最后對修改一下Identity的注冊代碼,將與IEmailSender有關的代碼注釋掉(注:默認生成代碼中包含郵件發送邏輯,但是沒有EmailSender的實作,除了注釋相關代碼外也可以實作一個IEmailSender并注冊到容器中來解決問題):

啟動應用,訪問注冊頁面注冊用戶:https://localhost:55002/Identity/Account/Register

注冊成功后,在資料庫中為相應的client資訊手動添加一潭訓于用戶名密碼的Grant Type(password),即可使用注冊的用戶來通過password的方式獲取access token了:

以下是通過剛注冊用戶名密碼獲得的access token:

對上面的access token解碼后可以看到它的payload部分包含以下資訊(sub使用了用戶的Id):

小提示:在IdentityServer4中獲取Token時會根據請求對攜帶的Client資訊以及相關引數進行驗證,本例中如果Client不支持Password的Grant Type,那么會導致不支持相應的授權型別而導致無法正確獲得Access Token,遇到無法正確獲得Access Token或者一些驗證錯誤的時候可以在除錯模式下查看IdentityServer的輸出,里面會包含相關授權成功/失敗的資訊,
小結
本篇文章通過集成asp.net core identity組件實作了用戶管理,包括注冊、登錄等,并且實作了通過注冊的用戶,基于Oauth2.0的用戶名密碼模式(password grant type)來獲取到Access Token,但就目前為止本系統文章所實作的、演示的IdentityServer功能仍舊是基于Oauth2.0協議,從下一篇文章開始就會開始介紹OpenIDConnect(oidc)相關的內容,此外現階段實作的Identity登錄也僅僅只是Identity本身的內容,針對OpenIDConnect或者說IdentityServer4它還有一些額外的操作,如事件、授權同意等等,這些內容也會在后續文章中不斷完善,
參考:
https://docs.microsoft.com/en-us/aspnet/core/security/authentication/identity?view=aspnetcore-5.0&tabs=visual-studio
https://natemcmaster.com/blog/2018/08/29/netcore-primitives-2/
本文鏈接:https://www.cnblogs.com/selimsong/p/14338193.html
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/253751.html
標籤:.NET技术
上一篇:Asp.Net Core之Identity應用(上篇)
下一篇:到底該不該使用存盤程序
