ABP VNext實踐之搭建可用於生產的IdentityServer4

LouieGuo發表於2020-09-02

一、前言


  用了半年多的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 歡迎加群交流
如果您認為這篇文章還不錯或者有所收穫,您可以點選右下角的【推薦】按鈕精神支援,因為這種支援是我繼續寫作,分享的最大動力!

作者:LouieGuo
宣告:原創部落格請在轉載時保留原文連結或者在文章開頭加上本人部落格地址,如發現錯誤,歡迎批評指正。凡是轉載於本人的文章,不能設定打賞功能,如有特殊需求請與本人聯絡!

微信公眾號:歡迎關注                                                 QQ技術交流群: 歡迎加群

                

 

相關文章