ABP 6.0.0-rc.1的新特性

  2022-07-26官方發布ABP 6.0.0-rc.1版本,本文挑選了幾個新特性進行了介紹,主要包括LeptonX Lite默認主題、OpenIddict模組,以及如何將Identity Server遷移到OpenIddict。據ABP官方公眾號介紹,ABP 6.0.0穩定版的計劃發布日期為2022-09-06,具體以實際發布日期為準。

一.LeptonX Lite默認主題

  LeptonX Lite算是LeptonX Theme的一個簡單實現,使用的是Razor Pages技術,而LeptonX Theme在ABP的商業版中有著完整的實現[17]。以前在ABP的MVC啟動模板中,使用的是基本主題[18],而ABP 6.0.0-rc.1把LeptonX Lite作為默認主題[19]。

1.基本主題

基本主題的樣子如下:

  基本主題在使用的時候都安裝了哪些包呢?主要是在Web項目中需要安裝Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic包,同時在模組類中需要依賴AbpAspNetCoreMvcUiBasicThemeModule模組,安裝npm install @abp/aspnetcore.mvc.ui.theme.basic,運行abp install-libs。在wwwroot/styles中自定義global-styles.css文件,並且把該文件配置在模組的ConfigureServices()方法中:

Configure<AbpBundlingOptions>(options =>
{
    options.StyleBundles.Configure(BasicThemeBundles.Styles.Global, bundle =>
    {
        bundle.AddFiles("/styles/global-styles.css");
    });
});

2.LeptonX Lite主題

  LeptonX Lite的樣子如下:

LeptonX Lite主題在使用的時候和基本主題差不多,差異如下:
(1)更新或安裝CLI

dotnet tool update Volo.Abp.Cli -g --version 6.0.0-rc.1
dotnet tool install Volo.Abp.Cli -g --version 6.0.0-rc.1

(2)安裝包

dotnet add package Volo.Abp.AspNetCore.Mvc.UI.Theme.LeptonXLite --prerelease

說明:務必加上這個–prerelease選項。
(3)依賴模組

[DependsOn(
     // Remove BasicTheme module from DependsOn attribute
-    typeof(AbpAspNetCoreMvcUiBasicThemeModule),
     
     // Add LeptonX Lite module to DependsOn attribute
+    typeof(AbpAspNetCoreMvcUiLeptonXLiteThemeModule),
)]

(4)配置服務

Configure<AbpBundlingOptions>(options =>
{
    options.StyleBundles.Configure(
        // Remove following line
-       BasicThemeBundles.Styles.Global,
        // Add following line instead
+       LeptonXLiteThemeBundles.Styles.Global
        bundle =>
        {
            bundle.AddFiles("/global-styles.css");
        }
    );
});

  ABP商業版的LeptonX Theme樣子如下:

說明:因為平時在開發中使用的前後端分離方式,所以對這塊不做過多介紹,了解即可。如果感興趣,可以深入的學習下Razor Pages、Blazor、Bootstrap、jQuery等技術。

二.OpenIddict模組

  這次ABP 6.0.0-rc.1較大的一個變化就是開始使用OpenIddict代替IDS(IdentityServer),因為IDS要收費了。ABP封裝的OpenIddict模組源碼結構如下:

1.將Demo項目運行起來

  在模組的app目錄下有6個項目,重點關心的是OpenIddict.Demo.Server和OpenIddict.Demo.API,前者是集成模組的ABP應用,包含2個clients和1個scope。後者是使用authentication認證的ASP.NET Core API應用。配置好OpenIddict.Demo.Server的appsettings.json文件,然後啟動OpenIddict.Demo.Server和OpenIddict.Demo.API項目。//localhost:44303/api/claims介面如下:

  OpenIddict.Demo.Server項目啟動後,生成的資料庫OpenIddict-Demo-Server如下:

2.Volo.Abp.OpenIddict模組


4個Repository分別為:

IOpenIddictApplicationRepository
IOpenIddictScopeRepository
IOpenIddictAuthorizationRepository
IOpenIddictTokenRepository

4個Store分別為:

IOpenIddictApplicationStore
IOpenIddictScopeStore
IOpenIddictAuthorizationStore
IOpenIddictTokenStore

  Repository和Store的關係是什麼呢?就是在Store中可以使用Repository來操作上述4種實體。從數據表上看,覺得OpenIddict相對於IDS4還是簡單的,繼續深入研究OpenIddict可以參考相關資源[6]-[15][21]。
  另外講下怎麼將OpenIddict模組運行起來,因為ABP中的模組在依賴其它項目的時候,都使用的源碼依賴,將項目依賴(ProjectReference)修改為包依賴(PackageReference)即可。修改後的OpenIddict模組源碼下載鏈接[23]。

三.MAUI啟動模板

  ABP 6.0.0-rc.1版本的CLI還不支援通過MAUI模板來創建項目,應該要到ABP 6.0.0版本了:

四.將Identity Server遷移到OpenIddict[10]

1.OpenIddict默認授權服務

  從ABP 6.0.0版本起,在ABP的啟動模板中默認使用OpenIddict作為授權服務,ABP應該會一直支援IDS的,ABP7.0將基於.NET7,如果IDS支援.NET7,那麼ABP也會繼續跟進的。但是ABP不會支援商業版本的Duende IDS[22]。

2.IDS遷移OpenIddict步驟

(1)將所有Volo的軟體包更新為6.x
(2)使用相應的OpenIddict.*包替換VoloIdentityServer.*包。比如,Volo.Abp.IdentityServer.DomainVolo.Abp.OpenIddict.DomainVolo.Abp.Account.Web.IdentityServerVolo.Abp.Account.Web.OpenIddict
(3)使用相應的OpenIddict模組替換所有IdentityServer模組。比如,AbpIdentityServerDomainModuleAbpOpenIddictDomainModuleAbpAccountWebIdentityServerModuleAbpAccountWebOpenIddictModule
(4)在ProjectNameDbContext類中,重命名ConfigureIdentityServerConfigureOpenIddict
(5)在UseAuthentication後,刪除UseIdentityServer,添加UseAbpOpenIddictValidation
(6)在啟動模組中添加如下程式碼:

public override void PreConfigureServices(ServiceConfigurationContext context)
{
    PreConfigure<OpenIddictBuilder>(builder =>
    {
        builder.AddValidation(options =>
        {
            options.AddAudiences("ProjectName"); //修改為實際項目的名字
            options.UseLocalServer();
            options.UseAspNetCore();
        });
    });
}

(7)如果項目不是單獨的AuthServer,那麼添加ForwardIdentityAuthenticationForBearer

private void ConfigureAuthentication(ServiceConfigurationContext context)
{
    context.Services.ForwardIdentityAuthenticationForBearer(OpenIddictValidationAspNetCoreDefaults.AuthenticationScheme);
}

(8)將IdentityServerDataSeedContributorDomain項目中刪除。
(9)創建新版本的項目,並且與現有項目同名。
(10)拷貝新項目的ProjectName.Domain\OpenIddict\OpenIddictDataSeedContributor.cs到項目中,並且基於ProjectName.DbMigrator\appsettings.json來更新appsettings.json,注意修改埠號。
(11)如果在IndexModel中使用IClientRepository,那麼拷貝新項目的Index.cshtml.csIndex.cs到項目中。
(12)在AddAbpOpenIdConnect()方法中,更新scope的名字從roleroles
(13)在HttpApi.Host項目中,刪除options.OAuthClientSecret(configuration["AuthServer:SwaggerClientSecret"]);
(14)AuthServer不再要求JWT bearer authentication,需要刪除它,比如AddJwtBearerUseJwtTokenMiddleware
(15)在IDE中嘗試編譯項目,根據報錯來刪除和引用程式碼和命名空間。
(16)如果使用EF Core作為DatabaseProvider,那麼遷移和更新資料庫。

3.OpenIddict相關的模組包

(1)開源版本

Volo.Abp.OpenIddict.Domain (AbpOpenIddictDomainModule)
Volo.Abp.OpenIddict.Domain.Shared (AbpOpenIddictDomainSharedModule)
Volo.Abp.OpenIddict.EntityFrameworkCore (AbpOpenIddictEntityFrameworkCoreModule)
Volo.Abp.OpenIddict.AspNetCore (AbpOpenIddictAspNetCoreModule)
Volo.Abp.OpenIddict.MongoDB (AbpOpenIddictMongoDbModule)
Volo.Abp.Account.Web.OpenIddict (AbpAccountWebOpenIddictModule)
Volo.Abp.PermissionManagement.Domain.OpenIddict (AbpPermissionManagementDomainOpenIddictModule)

(2)商業版本

Volo.Abp.OpenIddict.Pro.Application.Contracts (AbpOpenIddictProApplicationContractsModule)
Volo.Abp.OpenIddict.Pro.Application (AbpOpenIddictProApplicationModule)
Volo.Abp.OpenIddict.Pro.HttpApi.Client (AbpOpenIddictProHttpApiClientModule)
Volo.Abp.OpenIddict.Pro.HttpApi (AbpOpenIddictProHttpApiModule)
Volo.Abp.OpenIddict.Pro.Blazor(AbpOpenIddictProBlazorModule)
Volo.Abp.OpenIddict.Pro.Blazor.Server (AbpOpenIddictProBlazorServerModule)
Volo.Abp.OpenIddict.Pro.Blazor.WebAssembly (AbpOpenIddictProBlazorWebAssemblyModule)
Volo.Abp.OpenIddict.Pro.Web (AbpOpenIddictProWebModule)

五.ABP的路線圖

  貌似進展比較慢,特別是Vue啟動模板,千呼萬喚都出不來。不過似乎也不重要了,GitHub上面有很多的基於Vue的前端框架,比如vue-element-admin就不錯:

參考文獻:
[1]ABP v5.3.3和6.0.0-rc.1比較改變://github.com/abpframework/abp/compare/5.3.3…6.0.0-rc.1
[2]ABP路線圖://docs.abp.io/zh-Hans/abp/latest/Road-Map
[3]ABP 6.0.0-rc.1最近發布日誌://github.com/abpframework/abp/releases
[4]ABP.IO Platform 6.0 RC Has Been Published://blog.abp.io/abp/ABP.IO-Platform-6.0-RC-Has-Been-Published
[5]ABP框架功能://abp.io/features
[6]Add OpenIddict module://github.com/abpframework/abp/pull/12084
[7]ABP OpenIddict Modules://github.com/abpframework/abp/blob/dev/docs/en/Modules/OpenIddict.md
[8]Announcement of plan to replace the IdentityServer://github.com/abpframework/abp/issues/11989
[9]ABP OpenIddict Modules://docs.abp.io/zh-Hans/abp/6.0/Modules/OpenIddict
[10]Migration Identity Server to OpenIddict Guide://docs.abp.io/en/abp/6.0/Migration-Guides/IdentityServer_To_OpenIddict
[11]OpenIddict://github.com/openiddict
[12]OpenIddict官方文檔://documentation.openiddict.com/
[13]openiddict/openiddict-core://github.com/openiddict/openiddict-core
[14]openiddict/openiddict-samples://github.com/openiddict/openiddict-samples
[15]openiddict/openiddict-documentation://github.com/openiddict/openiddict-documentation

[16]Integrated MAUI application startup template://github.com/abpframework/abp/pull/12962
[17]LeptonX Theme://x.leptontheme.com/
[18]ASP.NET Core MVC/Razor Pages: The Basic Theme://docs.abp.io/en/abp/latest/UI/AspNetCore/Basic-Theme
[19]LeptonX Lite MVC UI://docs.abp.io/en/abp/latest/Themes/LeptonXLite/AspNetCore
[20]ASP.NET Core MVC/Razor Pages: UI Theming://docs.abp.io/en/abp/latest/UI/AspNetCore/Theming
[21]abp-samples/Ids2OpenId://github.com/abpframework/abp-samples/tree/master/Ids2OpenId
[22]Fair Trade Software License://blog.duendesoftware.com/posts/20220111_fair_trade
[23]修改後的OpenIddict模組源碼://url39.ctfile.com/f/2501739-633476836-599209?p=2096 (訪問密碼: 2096)

Tags: