1. 程式人生 > >Asp.Net Core IdentityServer4 管理面板整合

Asp.Net Core IdentityServer4 管理面板整合

前言

       IdentityServer4(以下簡稱 Id4) 是 Asp.Net Core 中一個非常流行的 OpenId Connect 和 OAuth 2.0 框架,可以輕鬆整合到 Asp.Net Core 應用中,並且與 Asp.Net Core Identity 也可以輕鬆整合。部落格園也有大佬釋出了很多關於 Id4 的相關文章。比如曉晨Master的系列入門教程:IdentityServer4 中文文件與實戰,我也是看他的教程學習入門的,教程基於 .Net Core 2.x,但是影響不大。

       但是這個教程還有一個遺憾,沒有關於如何管理 Id4 資料的部分,而 Id4 本身的資料模型還是有點小複雜的,直接去改資料庫心裡發慌,也不是長久之計。Id4 作為開源框架也為商業化留了一手,就是關於 Id4 的管理,需要付費才能獲得 Id4 團隊準備的管理模組。幸好萬能的 Github 上有大神開源了自制的管理模組。其中最著名的應該就是 Skoruba.IdentityServer4.Admin 了。這個管理模組包含了一些基本包、3個可執行專案(主身份伺服器,網頁版管理器和 Web Api 版管理器)和一個 VS 解決方案模板。從零開始搭建專案沒什麼問題,但如果已經有一個包含 Id4 的專案的情況下要怎麼辦呢?問題就在於要如何把解決方案模板中的管理器專案移花接木到自己的主專案中,在一些情況下,甚至可能需要把管理器直接整合到現有專案。經過一段時間的研究,終於把這個問題搞定了,在此也分享給各位園友。

正文

       整合改造過程中,我下載了管理專案原始碼、建立了模板解決方案用作參考,也 copy 了部分程式碼到我的主專案中,如果各位需要在我的演示基礎上繼續改造,也可以提前準備這些程式碼參考。同時由於原始專案對 AutoMapper 的使用方式與 DI 整合的使用方式衝突,我沒有使用內建服務實現,使用了我改造後的服務實現。

       接下來簡述一下我的改造步驟,由於改造專案持續時間較長,可能有疏漏。可以到文章末尾下載我的專案實際執行體驗。

       1、在 Startup.ConfigureServices 中註冊 AutoMapper,因為我的配置檔案分散在不同專案中,寫法比較特殊;改造 Id4 的 AutoMapper 相關程式碼:

 1             AutoMapper.IConfigurationProvider config = new MapperConfiguration(cfg =>
 2             {
 3                 var profileTypes =
 4                 from assembly in AppDomain.CurrentDomain.GetAssemblies()
 5                 from type in assembly.GetTypes()
 6                 where type.IsSubclassOf(typeof(Profile)) && !type.IsGenericType && !type.IsAbstract
 7                 select type;
 8 
 9                 var profiles = profileTypes.Select(x =>
10                     {
11                         try
12                         {
13                             return (Profile)Activator.CreateInstance(x);
14                         }
15                         catch (MissingMethodException ex)
16                         {
17                             return null;
18                         }
19                         catch(Exception ex)
20                         {
21                             throw ex;
22                         }
23                     }).Where(x => x != null);
24                 cfg.AddProfiles(profiles);
25             });
26             services.AddSingleton(config);
27             services.AddScoped<IMapper, Mapper>();
Startup.ConfigureServices

       2、Id4 Mappers 的改造思路是去掉內建的 IMapper 例項,讓管理服務把注入的 Imapper 作為引數傳遞給輔助方法。這裡以其中一個為例,其他類似的都這麼操作。把管理服務中的各種 ToModel() 和 ToEntity() 改成 ToModel(mapper) 和 ToEntity(mapper),別忘了在服務中注入 IMapper,從原始碼中拷貝服務原始碼並修改。

 1     public static class PersistedGrantMappers
 2     {
 3         //static PersistedGrantMappers()
 4         //{
 5         //    Mapper = new MapperConfiguration(cfg => cfg.AddProfile<PersistedGrantMapperProfile>())
 6         //        .CreateMapper();
 7         //}
 8 
 9         //internal static IMapper Mapper { get; }
10 
11         public static PersistedGrantsDto ToModel(this PagedList<PersistedGrantDataView> grant, IMapper mapper)
12         {
13             return grant == null ? null : mapper.Map<PersistedGrantsDto>(grant);
14         }
15 
16         public static PersistedGrantsDto ToModel(this PagedList<PersistedGrant> grant, IMapper mapper)
17         {
18             return grant == null ? null : mapper.Map<PersistedGrantsDto>(grant);
19         }
20 
21         public static PersistedGrantDto ToModel(this PersistedGrant grant, IMapper mapper)
22         {
23             return grant == null ? null : mapper.Map<PersistedGrantDto>(grant);
24         }
25     }
View Code

       3、對比模板專案程式碼和自己專案程式碼進行融合,比如複製控制器、檢視、js指令碼、css樣式、resx資源等各種新增檔案,修改 Startup 註冊 Id4 管理的各種程式碼,引入 TagHelper 等修改檔案。這個部分就是需要耐心和細心,沒什麼技術含量。注意把註冊服務的程式碼改成註冊改造後的服務實現。根據需要改造檢視等等。程式碼比較分散,就不貼了,有興趣的朋友去我的專案中看吧。

效果預覽:

       地址為:https://localhost:5001/IdentityServer/ConfigHome

 

        Swagger UI 地址為:https://localhost:5001/swagger/index.html。可以通過點選 Authorize 按鈕登入管理賬號,完全視覺化操作,沒有任何難度門檻。注意上面的說明,為不同的登入賬號選擇對應的 scopes,不然 Id4 會返回授權請求錯誤。一個 client 請求授權的各種資源和許可權必須在 Id4 中提前登記備案,請求的許可權和登記備案過的許可權不一致會被駁回授權請求。

 

注意事項:

       1、Id4 管理模板使用了 resx 管理多語言翻譯,和我專案使用的方案不相容,為此我專門改造了 Asp.Net Core 本地化服務,詳情見我的部落格:Asp.Net Core 混合全球化與本地化支援。

       2、專案中保留了2個融合改造後的獨立網頁管理專案和 Web  Api 管理專案,所以本示例一共包含4個管理入口,分別是整合在主專案中的網頁和 Api 埠、獨立的網頁和 Api 埠。

       3、初始賬號中所有入口都只有 admin 有權訪問 Id4 管理埠,埠已經由 Id4 的初始設定進行保護。所有賬號的初始密碼為:Pass123$。

結語

       完成改造後,才算是完整集成了 Id4 這個框架,永遠用教程程式碼裡寫死的那些 Client 終歸不是長久之計。

 

       轉載請完整保留以下內容並在顯眼位置標註,未經授權刪除以下內容進行轉載盜用的,保留追究法律責任的權利!

  本文地址:https://www.cnblogs.com/coredx/p/12318135.html

  完整原始碼:Github

  裡面有各種小東西,這只是其中之一,不嫌棄的話可以Star一下。