【.NET Core项目实战-统一认证平台】第九章 授权篇-使用Dapper持久化IdentityServer4...
上篇文章介紹了IdentityServer4的源碼分析的內容,讓我們知道了IdentityServer4的一些運行原理,這篇將介紹如何使用dapper來持久化Identityserver4,讓我們對IdentityServer4理解更透徹,并優化下數據請求,減少不必要的開銷。
.netcore項目實戰交流群(637326624),有興趣的朋友可以在群里交流討論。
一、數據如何實現持久化
在進行數據持久化之前,我們要了解Ids4是如何實現持久化的呢?Ids4默認是使用內存實現的IClientStore、IResourceStore、IPersistedGrantStore三個接口,對應的分別是InMemoryClientStore、InMemoryResourcesStore、InMemoryPersistedGrantStore三個方法,這顯然達不到我們持久化的需求,因為都是從內存里提取配置信息,所以我們要做到Ids4配置信息持久化,就需要實現這三個接口,作為優秀的身份認證框架,肯定已經幫我們想到了這點啦,有個EFCore的持久化實現,GitHub地址https://github.com/IdentityServer/IdentityServer4.EntityFramework,是不是萬事大吉了呢?拿來直接使用吧,使用肯定是沒有問題的,但是我們要分析下實現的方式和數據庫結構,便于后續使用dapper來持久化和擴展成任意數據庫存儲。
下面以IClientStore接口接口為例,講解下如何實現數據持久化的。他的方法就是通過clientId獲取Client記錄,乍一看很簡單,不管是用內存或數據庫都可以很簡單實現。
Task<Client> FindClientByIdAsync(string clientId);要看這個接口實際用途,就可以直接查看這個接口被注入到哪些方法中,最簡單的方式就是Ctrl+F
,通過查找會發現,Client實體里有很多關聯記錄也會被用到,因此我們在提取Client信息時需要提取他對應的關聯實體,那如果是數據庫持久化,那應該怎么提取呢?這里可以參考IdentityServer4.EntityFramework項目,我們執行下客戶端授權如下圖所示,您會發現能夠正確返回結果,但是這里執行了哪些SQL查詢呢?
從EFCore實現中可以看出來,就一個簡單的客戶端查詢語句,盡然執行了10次數據庫查詢操作(可以使用SQL Server Profiler查看詳細的SQL語句),這也是為什么使用IdentityServer4獲取授權信息時奇慢無比的原因。
這肯定不是實際生產環境中想要的結果,我們希望是盡量一次連接查詢到想要的結果。其他2個方法類似,就不一一介紹了,我們需要使用dapper來持久化存儲,減少對服務器查詢的開銷。
特別需要注意的是,在使用refresh_token時,有個有效期的問題,所以需要通過可配置的方式設置定期清除過期的授權信息,實現方式可以通過數據庫作業、定時器、后臺任務等,使用dapper持久化時也需要實現此方法。
二、使用Dapper持久化
下面就開始搭建Dapper的持久化存儲,首先建一個IdentityServer4.Dapper類庫項目,來實現自定義的擴展功能,還記得前幾篇開發中間件的思路嗎?這里再按照設計思路回顧下,首先我們考慮需要注入什么來解決Dapper的使用,通過分析得知需要一個連接字符串和使用哪個數據庫,以及配置定時刪除過期授權的策略。
新建IdentityServerDapperBuilderExtensions類,實現我們注入的擴展,代碼如下。
整體框架基本確認了,現在就需要解決這里用到的幾個配置信息和實現。
DapperStoreOptions需要接收那些參數?
如何使用dapper實現存儲的三個接口信息?
首先我們定義下配置文件,用來接收數據庫的連接字符串和配置清理的參數并設置默認值。
如上圖所示,這里定義了最基本的配置信息,來滿足我們的需求。
下面開始來實現客戶端存儲,SqlServerClientStore類代碼如下。
這里面涉及到幾個知識點,第一dapper的高級使用,一次性提取多個數據集,然后逐一賦值,需要注意的是sql查詢順序和賦值順序需要完全一致。第二是AutoMapper的實體映射,最后封裝的一句代碼就是_client.ToModel();即可完成,這與這塊使用還不是很清楚,可學習相關知識后再看,詳細的映射代碼如下。
這樣就完成了從數據庫里提取客戶端信息及相關關聯表記錄,只需要一次連接即可完成,奈斯,達到我們的要求。接著繼續實現其他2個接口,下面直接列出2個類的實現代碼。
SqlServerResourceStore.cs
使用dapper提取存儲數據已經全部實現完,接下來我們需要實現定時清理過期的授權信息。
首先定義一個清理過期數據接口IPersistedGrants,定義如下所示。
現在我們來實現下此接口,詳細代碼如下。
有個清理的接口和實現,我們需要注入下實現builder.Services.AddTransient<IPersistedGrants, SqlServerPersistedGrants>();,接下來就是開啟后端服務來清理過期記錄。
是不是實現一個定時任務很簡單呢?功能完成別忘了注入實現,現在我們使用dapper持久化的功能基本完成了。
builder.Services.AddSingleton<TokenCleanup>(); builder.Services.AddSingleton<IHostedService, TokenCleanupHost>();三、測試功能應用
在前面客戶端授權中,我們增加dapper擴展的實現,來測試功能是否能正常使用,且使用SQL Server Profiler來監控下調用的過程。可以從之前文章中的源碼TestIds4項目中,實現持久化的存儲,改造注入代碼如下。
好了,現在可以配合網關來測試下客戶端登錄了,打開PostMan,啟用本地的項目,然后訪問之前配置的客戶端授權地址,并開啟SqlServer監控,查看運行代碼。
訪問能夠得到我們預期的結果且查詢全部是dapper寫的Sql語句。且定期清理任務也啟動成功,會根據配置的參數來執行清理過期授權信息。
四、使用Mysql存儲并測試
這里Mysql重寫就不一一列出來了,語句跟sqlserver幾乎是完全一樣,然后調用.UseMySql()即可完成mysql切換,我花了不到2分鐘就完成了Mysql的所有語句和切換功能,是不是簡單呢?接著測試Mysql應用,代碼如下。
可以返回正確的結果數據,擴展Mysql實現已經完成,如果想用其他數據庫實現,直接按照我寫的方法擴展下即可。
五、總結及預告
本篇我介紹了如何使用Dapper來持久化Ids4信息,并介紹了實現過程,然后實現了SqlServer和Mysql兩種方式,也介紹了使用過程中遇到的技術問題,其實在實現過程中我發現的一個緩存和如何讓授權信息立即過期等問題,這塊大家可以一起先思考下如何實現,后續文章中我會介紹具體的實現方式,然后把緩存遷移到Redis里。
下一篇開始就正式介紹Ids4的幾種授權方式和具體的應用,以及如何在我們客戶端進行集成,如果在學習過程中遇到不懂或未理解的問題,歡迎大家加入QQ群聊637326624與作者聯系吧。
相關文章:
AspNetCore中使用Ocelot之 IdentityServer4
Ocelot-基于.NET Core的開源網關實現
.NET Core微服務之基于Ocelot+IdentityServer實現統一驗證與授權
Swagger如何訪問Ocelot中帶權限驗證的API
Ocelot.JwtAuthorize:一個基于網關的Jwt驗證包
.NET Core微服務之基于Ocelot實現API網關服務
.NET Core微服務之基于Ocelot實現API網關服務(續)
.NET微服務體系結構中為什么使用Ocelot實現API網關
Ocelot簡易教程(一)之Ocelot是什么
Ocelot簡易教程(二)之快速開始1
Ocelot簡易教程(二)之快速開始2
Ocelot簡易教程(三)之主要特性及路由詳解
Ocelot簡易教程(四)之請求聚合以及服務發現
Ocelot簡易教程(五)之集成IdentityServer認證以及授權
Ocelot簡易教程(六)之重寫配置文件存儲方式并優化響應數據
Ocelot簡易教程(七)之配置文件數據庫存儲插件源碼解析
ASP.NET Core中Ocelot的使用:API網關的應用
ASP.NET Core中Ocelot的使用:基于Spring Cloud Netflix Eureka的動態路由
ASP.NET Core中Ocelot的使用:基于服務發現的負載均衡
【.NET Core項目實戰-統一認證平臺】第一章 功能及架構分析
定制Ocelot來滿足需求
【.NET Core項目實戰-統一認證平臺】第三章 網關篇-數據庫存儲配置(1)
【.NET Core項目實戰-統一認證平臺】第四章 網關篇-數據庫存儲配置(2)
【.NET Core項目實戰-統一認證平臺】第五章 網關篇-自定義緩存Redis
【.NET Core項目實戰-統一認證平臺】第六章 網關篇-自定義客戶端授權
【.NET Core項目實戰-統一認證平臺】第七章 網關篇-自定義客戶端限流
【.NET Core項目實戰-統一認證平臺】第八章 授權篇-IdentityServer4源碼分析
原文地址:https://www.cnblogs.com/jackcao/p/10058274.html
.NET社區新聞,深度好文,歡迎訪問公眾號文章匯總 http://www.csharpkit.com
總結
以上是生活随笔為你收集整理的【.NET Core项目实战-统一认证平台】第九章 授权篇-使用Dapper持久化IdentityServer4...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 微软推出了Cloud Native Ap
- 下一篇: 打造自己的.NET Core项目模板