一、前言
用了半年多的abp vnext,在開發的效果還是非常的好,可以說節省了很多時間,像事件匯流排、模組化開發、動態API進行遠端呼叫、自動API控制器等等,一整套的規範,讓開發人員更方便的整合,提升效率;大家如果想多瞭解abp vnext 更多的資料或者原始碼,可以到github上看,文章結尾也會給出原始碼地址和wiki地址,優秀的你們要更優秀才行。
今天給大家講講如何在利用abp vnext框架搭建IDS4且可以在生產環境下使用的,其中也需要針對於IDS4在liunx系統使用nginx代理中端點不是https的特別注意事項配置,這個也是一個坑,如果不注意,授權就不成功,除非配置了跳過https的強制驗證;
二、ABP VNext CLI生成一個專案解決方案
CLI 命令大家可以參考wiki,命令如下:abp new Louie.Ids4Demo --ui none --separate-identity-server,其中 --separate-identity-server代表將IdentityServer應用程式與API host應用程式分開,--ui none 無UI;開啟命令視窗,拷貝進去後就可以生成一個解決方案;
然後我們授權需要修改一下專案中的程式碼遷移配置,因為我這邊用的是mysql,而命令生成的是使用sqlserver,在 Louie.Ids4Demo.EntityFrameworkCore中把SQLServer改成Mysql nuget包,並且在DbMigrations類庫中刪除Migrations資料夾,然後修改DbContextFactory.cs裡面的配置;截圖如下:
1、Louie.Ids4Demo.EntityFrameworkCore 類庫,去掉sqlserver包,新增mysql包
開啟 Ids4DemoEntityFrameworkCoreModule 修改模組注入和名稱空間
2、Louie.Ids4Demo.EntityFrameworkCore.DbMigrations 類庫,刪除Migrations檔案
並且修改Ids4DemoMigrationsDbContextFactory.cs檔案中的連結配置
3、在Louie.Ids4Demo.IdentityServer 主程式中 appsetting.json 新增資料庫連線字串
4、然後使用遷移命令,生成對應的資料庫表
5、開啟Louie.Ids4Demo.IdentityServer 主程式,開啟Ids4DemoIdentityServerModule.cs 類
在裡面配置自定義的RSA非對稱加密證書,並且禁止在開發環境下由系統生成的臨時證書,我們需要使用重寫PreConfigureServices來替換框架預設的配置
public override void PreConfigureServices(ServiceConfigurationContext context) { var configuration = context.Services.GetConfiguration(); var filePath = Path.Combine(AppContext.BaseDirectory, configuration["Certificates:CerPath"]); if (!File.Exists(filePath)) { throw new FileNotFoundException($"沒有證書!"); } //禁止生成開發的id4證書 PreConfigure<AbpIdentityServerBuilderOptions>(options => { options.AddDeveloperSigningCredential = false; }); PreConfigure<IIdentityServerBuilder>(opt => { opt.AddSigningCredential(new X509Certificate2( filePath, configuration["Certificates:Password"] //Export Password) )) .AddResourceOwnerValidator<AuthROPValidator>() .AddProfileService<AuthROPProfileService>(); }); }
當然證書是我自己生成的,大家可以自行生成,把生成好的證書放在主程式的目錄下,然後再appsetting.json 中配置一下
"Certificates": { //IDS4的簽名證書,防止串改 "CerPath": "xxxx/idsrv4.pfx", //路徑地址 "Password": "xxxx" //訪問x509證書的訪問密碼,在證書生成的時候有要求配置密碼 },
上面配置中有涉及到AddResourceOwnerValidator主要是用到密碼模式下的自定義驗證邏輯以及新增宣告,如果大家不需要則可以不用配置,直接註釋;AddProfileService 主要是是宣告claims需要和庫表中定義的申明一致,否則無法顯示,這個也是一個安全校驗的方式。
配置完後啟動開啟瀏覽器,並且啟動的url字尾新增 .well-known/openid-configuration,如果可以檢視到端點則代表配置成功。
6、問題來了,在我們的IDS4部署到docker上後,發現檢視的端點不是https的,我們需要在OnApplicationInitialization 方法中配置一個特殊程式碼
當然大家也可以看一下一個解決方案的issue:https://github.com/dotnet/AspNetCore.Docs/issues/2384
主要阿德原因是使用的反向代理導致域名是https的,但是端點無法對映https;插入以下程式碼即可
var forwardOptions = new ForwardedHeadersOptions { ForwardedHeaders = ForwardedHeaders.XForwardedFor | ForwardedHeaders.XForwardedProto, RequireHeaderSymmetry = false }; forwardOptions.KnownNetworks.Clear(); forwardOptions.KnownProxies.Clear(); // ref: https://github.com/aspnet/Docs/issues/2384 app.UseForwardedHeaders(forwardOptions);
大家在部署到生產線後就可以看到端點已經是https了
7、ids4配置已經介紹完成了,希望大家可以多為.net core開源社群貢獻一份力量
如果在開發過程中遇到問題,歡迎留言。
asp.net core 交流群:787464275 歡迎加群交流
如果您認為這篇文章還不錯或者有所收穫,您可以點選右下角的【推薦】按鈕精神支援,因為這種支援是我繼續寫作,分享的最大動力!
微信公眾號:歡迎關注 QQ技術交流群: 歡迎加群