Browse Source

Merge pull request #1416 from colinin/upt-10.0.0

upgrade: upgrade abp to 10.0.2
pull/1422/head
yx lin 2 months ago
committed by GitHub
parent
commit
8b99e02bf4
No known key found for this signature in database GPG Key ID: B5690EEEBB952194
  1. 725
      Directory.Packages.props
  2. 3
      apps/vben5/apps/app-antd/src/locales/langs/en-US/abp.json
  3. 3
      apps/vben5/apps/app-antd/src/locales/langs/zh-CN/abp.json
  4. 2
      apps/vben5/apps/app-antd/src/router/routes/core.ts
  5. 6
      apps/vben5/apps/app-antd/src/store/auth.ts
  6. 16
      apps/vben5/apps/app-antd/src/views/_core/fallback/login-callback.vue
  7. 12
      apps/vben5/packages/@abp/account/src/hooks/useOAuthError.ts
  8. 1
      apps/vben5/packages/@abp/account/src/utils/auth.ts
  9. 1
      apps/vben5/packages/@abp/openiddict/src/components/applications/ApplicationModal.vue
  10. 50
      apps/vben5/packages/@abp/openiddict/src/components/scopes/ScopeModal.vue
  11. 2
      apps/vben5/packages/@abp/saas/src/components/tenants/TenantModal.vue
  12. 11
      aspnet-core/LINGYUN.MicroService.SingleProject.sln
  13. 2
      aspnet-core/aspire/LINGYUN.Abp.MicroService.AdminService.DbMigrator/LINGYUN.Abp.MicroService.AdminService.DbMigrator.csproj
  14. 59
      aspnet-core/aspire/LINGYUN.Abp.MicroService.AdminService.EntityFrameworkCore/AdminServiceDataSeeder.cs
  15. 19
      aspnet-core/aspire/LINGYUN.Abp.MicroService.AdminService.EntityFrameworkCore/AdminServiceDbMigrationEventHandler.cs
  16. 12
      aspnet-core/aspire/LINGYUN.Abp.MicroService.AdminService.EntityFrameworkCore/AdminServiceDbMigrationService.cs
  17. 2
      aspnet-core/aspire/LINGYUN.Abp.MicroService.AdminService.EntityFrameworkCore/LINGYUN.Abp.MicroService.AdminService.EntityFrameworkCore.csproj
  18. 13
      aspnet-core/aspire/LINGYUN.Abp.MicroService.AdminService/AdminServiceModule.cs
  19. 2
      aspnet-core/aspire/LINGYUN.Abp.MicroService.AdminService/LINGYUN.Abp.MicroService.AdminService.csproj
  20. 3
      aspnet-core/aspire/LINGYUN.Abp.MicroService.AdminService/appsettings.Development.json
  21. 10
      aspnet-core/aspire/LINGYUN.Abp.MicroService.ApiGateway/ApiGatewayModule.cs
  22. 2
      aspnet-core/aspire/LINGYUN.Abp.MicroService.ApiGateway/LINGYUN.Abp.MicroService.ApiGateway.csproj
  23. 2
      aspnet-core/aspire/LINGYUN.Abp.MicroService.ApiGateway/Program.cs
  24. 6
      aspnet-core/aspire/LINGYUN.Abp.MicroService.ApiGateway/appsettings.Development.json
  25. 95
      aspnet-core/aspire/LINGYUN.Abp.MicroService.ApiGateway/yarp.json
  26. 2
      aspnet-core/aspire/LINGYUN.Abp.MicroService.AppHost/LINGYUN.Abp.MicroService.AppHost.csproj
  27. 2
      aspnet-core/aspire/LINGYUN.Abp.MicroService.AuthServer.DbMigrator/LINGYUN.Abp.MicroService.AuthServer.DbMigrator.csproj
  28. 29
      aspnet-core/aspire/LINGYUN.Abp.MicroService.AuthServer.DbMigrator/appsettings.json
  29. 35
      aspnet-core/aspire/LINGYUN.Abp.MicroService.AuthServer.EntityFrameworkCore/AuthServerDataSeeder.cs
  30. 109
      aspnet-core/aspire/LINGYUN.Abp.MicroService.AuthServer.EntityFrameworkCore/AuthServerDbMigrationEventHandler.cs
  31. 13
      aspnet-core/aspire/LINGYUN.Abp.MicroService.AuthServer.EntityFrameworkCore/AuthServerDbMigrationService.cs
  32. 89
      aspnet-core/aspire/LINGYUN.Abp.MicroService.AuthServer.EntityFrameworkCore/DataSeeds/IdentityClaimTypeDataSeeder.cs
  33. 124
      aspnet-core/aspire/LINGYUN.Abp.MicroService.AuthServer.EntityFrameworkCore/DataSeeds/IdentityUserRoleDataSeeder.cs
  34. 551
      aspnet-core/aspire/LINGYUN.Abp.MicroService.AuthServer.EntityFrameworkCore/DataSeeds/OpenIddictDataSeeder.cs
  35. 2
      aspnet-core/aspire/LINGYUN.Abp.MicroService.AuthServer.EntityFrameworkCore/LINGYUN.Abp.MicroService.AuthServer.EntityFrameworkCore.csproj
  36. 1251
      aspnet-core/aspire/LINGYUN.Abp.MicroService.AuthServer.EntityFrameworkCore/Migrations/20260109050516_Upgrade-Abp-Framework-To-10-0-2.Designer.cs
  37. 72
      aspnet-core/aspire/LINGYUN.Abp.MicroService.AuthServer.EntityFrameworkCore/Migrations/20260109050516_Upgrade-Abp-Framework-To-10-0-2.cs
  38. 13
      aspnet-core/aspire/LINGYUN.Abp.MicroService.AuthServer.EntityFrameworkCore/Migrations/AuthServerMigrationsDbContextModelSnapshot.cs
  39. 33
      aspnet-core/aspire/LINGYUN.Abp.MicroService.AuthServer/AuthServerModule.Configure.cs
  40. 17
      aspnet-core/aspire/LINGYUN.Abp.MicroService.AuthServer/AuthServerModule.cs
  41. 309
      aspnet-core/aspire/LINGYUN.Abp.MicroService.AuthServer/DataSeeder/AuthServerDataSeedContributor.cs
  42. 11
      aspnet-core/aspire/LINGYUN.Abp.MicroService.AuthServer/LINGYUN.Abp.MicroService.AuthServer.csproj
  43. 38
      aspnet-core/aspire/LINGYUN.Abp.MicroService.AuthServer/appsettings.Development.json
  44. 6
      aspnet-core/aspire/LINGYUN.Abp.MicroService.AuthServer/package.json
  45. 9
      aspnet-core/aspire/LINGYUN.Abp.MicroService.AuthServer/wwwroot/css/global-styles.css
  46. 6
      aspnet-core/aspire/LINGYUN.Abp.MicroService.IdentityService/IdentityServiceModule.cs
  47. 2
      aspnet-core/aspire/LINGYUN.Abp.MicroService.IdentityService/LINGYUN.Abp.MicroService.IdentityService.csproj
  48. 3
      aspnet-core/aspire/LINGYUN.Abp.MicroService.IdentityService/appsettings.Development.json
  49. 2
      aspnet-core/aspire/LINGYUN.Abp.MicroService.LocalizationService.DbMigrator/LINGYUN.Abp.MicroService.LocalizationService.DbMigrator.csproj
  50. 2
      aspnet-core/aspire/LINGYUN.Abp.MicroService.LocalizationService.EntityFrameworkCore/LINGYUN.Abp.MicroService.LocalizationService.EntityFrameworkCore.csproj
  51. 2
      aspnet-core/aspire/LINGYUN.Abp.MicroService.LocalizationService/LINGYUN.Abp.MicroService.LocalizationService.csproj
  52. 3
      aspnet-core/aspire/LINGYUN.Abp.MicroService.LocalizationService/appsettings.Development.json
  53. 2
      aspnet-core/aspire/LINGYUN.Abp.MicroService.MessageService.DbMigrator/LINGYUN.Abp.MicroService.MessageService.DbMigrator.csproj
  54. 2
      aspnet-core/aspire/LINGYUN.Abp.MicroService.MessageService.EntityFrameworkCore/LINGYUN.Abp.MicroService.MessageService.EntityFrameworkCore.csproj
  55. 2
      aspnet-core/aspire/LINGYUN.Abp.MicroService.MessageService/LINGYUN.Abp.MicroService.MessageService.csproj
  56. 3
      aspnet-core/aspire/LINGYUN.Abp.MicroService.MessageService/appsettings.Development.json
  57. 2
      aspnet-core/aspire/LINGYUN.Abp.MicroService.PlatformService.DbMigrator/LINGYUN.Abp.MicroService.PlatformService.DbMigrator.csproj
  58. 3
      aspnet-core/aspire/LINGYUN.Abp.MicroService.PlatformService.EntityFrameworkCore/LINGYUN.Abp.MicroService.PlatformService.EntityFrameworkCore.csproj
  59. 47
      aspnet-core/aspire/LINGYUN.Abp.MicroService.PlatformService.EntityFrameworkCore/PlatformServiceDataSeeder.cs
  60. 35
      aspnet-core/aspire/LINGYUN.Abp.MicroService.PlatformService.EntityFrameworkCore/PlatformServiceDbMigrationEventHandler.cs
  61. 12
      aspnet-core/aspire/LINGYUN.Abp.MicroService.PlatformService.EntityFrameworkCore/PlatformServiceDbMigrationService.cs
  62. 4
      aspnet-core/aspire/LINGYUN.Abp.MicroService.PlatformService.EntityFrameworkCore/PlatformServiceMigrationsEntityFrameworkCoreModule.cs
  63. 4
      aspnet-core/aspire/LINGYUN.Abp.MicroService.PlatformService/LINGYUN.Abp.MicroService.PlatformService.csproj
  64. 9
      aspnet-core/aspire/LINGYUN.Abp.MicroService.PlatformService/PlatformServiceModule.cs
  65. 3
      aspnet-core/aspire/LINGYUN.Abp.MicroService.PlatformService/appsettings.Development.json
  66. 2
      aspnet-core/aspire/LINGYUN.Abp.MicroService.ServiceDefaults/LINGYUN.Abp.MicroService.ServiceDefaults.csproj
  67. 2
      aspnet-core/aspire/LINGYUN.Abp.MicroService.TaskService.DbMigrator/LINGYUN.Abp.MicroService.TaskService.DbMigrator.csproj
  68. 2
      aspnet-core/aspire/LINGYUN.Abp.MicroService.TaskService.EntityFrameworkCore/LINGYUN.Abp.MicroService.TaskService.EntityFrameworkCore.csproj
  69. 139
      aspnet-core/aspire/LINGYUN.Abp.MicroService.TaskService.EntityFrameworkCore/TaskServiceDataSeeder.cs
  70. 122
      aspnet-core/aspire/LINGYUN.Abp.MicroService.TaskService.EntityFrameworkCore/TaskServiceDbMigrationEventHandler.cs
  71. 2
      aspnet-core/aspire/LINGYUN.Abp.MicroService.TaskService/LINGYUN.Abp.MicroService.TaskService.csproj
  72. 7
      aspnet-core/aspire/LINGYUN.Abp.MicroService.TaskService/appsettings.Development.json
  73. 2
      aspnet-core/aspire/LINGYUN.Abp.MicroService.WeChatService/LINGYUN.Abp.MicroService.WeChatService.csproj
  74. 6
      aspnet-core/aspire/LINGYUN.Abp.MicroService.WeChatService/appsettings.Development.json
  75. 2
      aspnet-core/aspire/LINGYUN.Abp.MicroService.WebhookService.DbMigrator/LINGYUN.Abp.MicroService.WebhookService.DbMigrator.csproj
  76. 2
      aspnet-core/aspire/LINGYUN.Abp.MicroService.WebhookService.EntityFrameworkCore/LINGYUN.Abp.MicroService.WebhookService.EntityFrameworkCore.csproj
  77. 3
      aspnet-core/aspire/LINGYUN.Abp.MicroService.WebhookService.EntityFrameworkCore/WebhookServiceDbMigrationEventHandler.cs
  78. 2
      aspnet-core/aspire/LINGYUN.Abp.MicroService.WebhookService/LINGYUN.Abp.MicroService.WebhookService.csproj
  79. 3
      aspnet-core/aspire/LINGYUN.Abp.MicroService.WebhookService/appsettings.Development.json
  80. 2
      aspnet-core/aspire/LINGYUN.Abp.MicroService.WorkflowService/LINGYUN.Abp.MicroService.WorkflowService.csproj
  81. 4
      aspnet-core/aspire/LINGYUN.Abp.MicroService.WorkflowService/appsettings.Development.json
  82. 2
      aspnet-core/framework/auditing/LINGYUN.Abp.AspNetCore.Auditing/LINGYUN.Abp.AspNetCore.Auditing.csproj
  83. 2
      aspnet-core/framework/auditing/LINGYUN.Abp.AuditLogging.Elasticsearch/LINGYUN.Abp.AuditLogging.Elasticsearch.csproj
  84. 43
      aspnet-core/framework/auditing/LINGYUN.Abp.AuditLogging.Elasticsearch/LINGYUN/Abp/AuditLogging/Elasticsearch/AbpAuditLoggingElasticsearchOptions.cs
  85. 194
      aspnet-core/framework/auditing/LINGYUN.Abp.AuditLogging.Elasticsearch/LINGYUN/Abp/AuditLogging/Elasticsearch/ElasticsearchAuditLogManager.cs
  86. 260
      aspnet-core/framework/auditing/LINGYUN.Abp.AuditLogging.Elasticsearch/LINGYUN/Abp/AuditLogging/Elasticsearch/ElasticsearchEntityChangeStore.cs
  87. 86
      aspnet-core/framework/auditing/LINGYUN.Abp.AuditLogging.Elasticsearch/LINGYUN/Abp/AuditLogging/Elasticsearch/ElasticsearchSecurityLogManager.cs
  88. 170
      aspnet-core/framework/auditing/LINGYUN.Abp.AuditLogging.Elasticsearch/LINGYUN/Abp/AuditLogging/Elasticsearch/IndexInitializer.cs
  89. 4
      aspnet-core/framework/auditing/LINGYUN.Abp.AuditLogging.EntityFrameworkCore/LINGYUN.Abp.AuditLogging.EntityFrameworkCore.csproj
  90. 11
      aspnet-core/framework/auditing/LINGYUN.Abp.AuditLogging.EntityFrameworkCore/LINGYUN/Abp/AuditLogging/EntityFrameworkCore/AbpAuditLoggingEntityFrameworkCoreModule.cs
  91. 58
      aspnet-core/framework/auditing/LINGYUN.Abp.AuditLogging.EntityFrameworkCore/LINGYUN/Abp/AuditLogging/EntityFrameworkCore/AbpAuditingEfCoreMappers.cs
  92. 23
      aspnet-core/framework/auditing/LINGYUN.Abp.AuditLogging.EntityFrameworkCore/LINGYUN/Abp/AuditLogging/EntityFrameworkCore/AbpAuditingMapperProfile.cs
  93. 6
      aspnet-core/framework/auditing/LINGYUN.Abp.AuditLogging.EntityFrameworkCore/LINGYUN/Abp/AuditLogging/EntityFrameworkCore/AuditLogManager.cs
  94. 6
      aspnet-core/framework/auditing/LINGYUN.Abp.AuditLogging.EntityFrameworkCore/LINGYUN/Abp/AuditLogging/EntityFrameworkCore/EntityChangeStore.cs
  95. 5
      aspnet-core/framework/auditing/LINGYUN.Abp.AuditLogging.EntityFrameworkCore/LINGYUN/Abp/AuditLogging/EntityFrameworkCore/SecurityLogManager.cs
  96. 2
      aspnet-core/framework/auditing/LINGYUN.Abp.AuditLogging.IP.Location/LINGYUN.Abp.AuditLogging.IP.Location.csproj
  97. 2
      aspnet-core/framework/auditing/LINGYUN.Abp.AuditLogging/LINGYUN.Abp.AuditLogging.csproj
  98. 2
      aspnet-core/framework/auditing/LINGYUN.Abp.AuditLogging/LINGYUN/Abp/AuditLogging/EntityChange.cs
  99. 31
      aspnet-core/framework/auditing/LINGYUN.Abp.AuditLogging/LINGYUN/Abp/AuditLogging/EntityChangeTypeConverter.cs
  100. 2
      aspnet-core/framework/authentication/LINGYUN.Abp.Authentication.QQ/LINGYUN.Abp.Authentication.QQ.csproj

725
Directory.Packages.props

@ -1,360 +1,367 @@
<Project>
<PropertyGroup>
<DotNetCoreCAPPackageVersion>8.3.5</DotNetCoreCAPPackageVersion>
<ElsaPackageVersion>2.15.2</ElsaPackageVersion>
<ElsaNextPackageVersion>3.3.5</ElsaNextPackageVersion>
<VoloAbpPackageVersion>9.3.6</VoloAbpPackageVersion>
<LINGYUNAbpPackageVersion>9.3.6</LINGYUNAbpPackageVersion>
<MicrosoftExtensionsPackageVersion>9.0.5</MicrosoftExtensionsPackageVersion>
<MicrosoftAspNetCorePackageVersion>9.0.5</MicrosoftAspNetCorePackageVersion>
<MicrosoftEntityFrameworkCorePackageVersion>9.0.5</MicrosoftEntityFrameworkCorePackageVersion>
<AspirePackageVersion>13.1.0</AspirePackageVersion>
<ManagePackageVersionsCentrally>true</ManagePackageVersionsCentrally>
</PropertyGroup>
<!-- Abp Framework -->
<ItemGroup>
<PackageVersion Include="Volo.Abp.AspNetCore.Mvc.UI.Theme.LeptonXLite" Version="4.3.6" />
<PackageVersion Include="Volo.Abp.Core" Version="$(VoloAbpPackageVersion)" />
<PackageVersion Include="Volo.Abp.Account.Application" Version="$(VoloAbpPackageVersion)" />
<PackageVersion Include="Volo.Abp.Account.Application.Contracts" Version="$(VoloAbpPackageVersion)" />
<PackageVersion Include="Volo.Abp.Account.Domain" Version="$(VoloAbpPackageVersion)" />
<PackageVersion Include="Volo.Abp.Account.Domain.Shared" Version="$(VoloAbpPackageVersion)" />
<PackageVersion Include="Volo.Abp.Account.EntityFrameworkCore" Version="$(VoloAbpPackageVersion)" />
<PackageVersion Include="Volo.Abp.Account.HttpApi" Version="$(VoloAbpPackageVersion)" />
<PackageVersion Include="Volo.Abp.Account.HttpApi.Client" Version="$(VoloAbpPackageVersion)" />
<PackageVersion Include="Volo.Abp.Account.Web" Version="$(VoloAbpPackageVersion)" />
<PackageVersion Include="Volo.Abp.Account.Web.IdentityServer" Version="$(VoloAbpPackageVersion)" />
<PackageVersion Include="Volo.Abp.Account.Web.OpenIddict" Version="$(VoloAbpPackageVersion)" />
<PackageVersion Include="Volo.Abp.AspNetCore" Version="$(VoloAbpPackageVersion)" />
<PackageVersion Include="Volo.Abp.AspNetCore.Authentication.JwtBearer" Version="$(VoloAbpPackageVersion)" />
<PackageVersion Include="Volo.Abp.AspNetCore.MultiTenancy" Version="$(VoloAbpPackageVersion)" />
<PackageVersion Include="Volo.Abp.AspNetCore.Mvc" Version="$(VoloAbpPackageVersion)" />
<PackageVersion Include="Volo.Abp.AspNetCore.Mvc.Client.Common" Version="$(VoloAbpPackageVersion)" />
<PackageVersion Include="Volo.Abp.AspNetCore.Mvc.Contracts" Version="$(VoloAbpPackageVersion)" />
<PackageVersion Include="Volo.Abp.AspNetCore.Mvc.NewtonsoftJson" Version="$(VoloAbpPackageVersion)" />
<PackageVersion Include="Volo.Abp.AspNetCore.Mvc.UI.MultiTenancy" Version="$(VoloAbpPackageVersion)" />
<PackageVersion Include="Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic" Version="$(VoloAbpPackageVersion)" />
<PackageVersion Include="Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared" Version="$(VoloAbpPackageVersion)" />
<PackageVersion Include="Volo.Abp.AspNetCore.Serilog" Version="$(VoloAbpPackageVersion)" />
<PackageVersion Include="Volo.Abp.AspNetCore.SignalR" Version="$(VoloAbpPackageVersion)" />
<PackageVersion Include="Volo.Abp.AspNetCore.TestBase" Version="$(VoloAbpPackageVersion)" />
<PackageVersion Include="Volo.Abp.Auditing" Version="$(VoloAbpPackageVersion)" />
<PackageVersion Include="Volo.Abp.Auditing.Contracts" Version="$(VoloAbpPackageVersion)" />
<PackageVersion Include="Volo.Abp.AuditLogging.Domain.Shared" Version="$(VoloAbpPackageVersion)" />
<PackageVersion Include="Volo.Abp.AuditLogging.EntityFrameworkCore" Version="$(VoloAbpPackageVersion)" />
<PackageVersion Include="Volo.Abp.Authorization" Version="$(VoloAbpPackageVersion)" />
<PackageVersion Include="Volo.Abp.Authorization.Abstractions" Version="$(VoloAbpPackageVersion)" />
<PackageVersion Include="Volo.Abp.Autofac" Version="$(VoloAbpPackageVersion)" />
<PackageVersion Include="Volo.Abp.AutoMapper" Version="$(VoloAbpPackageVersion)" />
<PackageVersion Include="Volo.Abp.BackgroundJobs" Version="$(VoloAbpPackageVersion)" />
<PackageVersion Include="Volo.Abp.BackgroundJobs.Abstractions" Version="$(VoloAbpPackageVersion)" />
<PackageVersion Include="Volo.Abp.BackgroundWorkers" Version="$(VoloAbpPackageVersion)" />
<PackageVersion Include="Volo.Abp.BlobStoring" Version="$(VoloAbpPackageVersion)" />
<PackageVersion Include="Volo.Abp.BlobStoring.FileSystem" Version="$(VoloAbpPackageVersion)" />
<PackageVersion Include="Volo.Abp.BlobStoring.Minio" Version="$(VoloAbpPackageVersion)" />
<PackageVersion Include="Volo.Abp.Caching" Version="$(VoloAbpPackageVersion)" />
<PackageVersion Include="Volo.Abp.Caching.StackExchangeRedis" Version="$(VoloAbpPackageVersion)" />
<PackageVersion Include="Volo.Abp.Cli.Core" Version="$(VoloAbpPackageVersion)" />
<PackageVersion Include="Volo.Abp.Data" Version="$(VoloAbpPackageVersion)" />
<PackageVersion Include="Volo.Abp.Dapper" Version="$(VoloAbpPackageVersion)" />
<PackageVersion Include="Volo.Abp.Ddd.Application" Version="$(VoloAbpPackageVersion)" />
<PackageVersion Include="Volo.Abp.Ddd.Application.Contracts" Version="$(VoloAbpPackageVersion)" />
<PackageVersion Include="Volo.Abp.Ddd.Domain" Version="$(VoloAbpPackageVersion)" />
<PackageVersion Include="Volo.Abp.Ddd.Domain.Shared" Version="$(VoloAbpPackageVersion)" />
<PackageVersion Include="Volo.Abp.DistributedLocking.Abstractions" Version="$(VoloAbpPackageVersion)" />
<PackageVersion Include="Volo.Abp.DistributedLocking" Version="$(VoloAbpPackageVersion)" />
<PackageVersion Include="Volo.Abp.EntityFrameworkCore" Version="$(VoloAbpPackageVersion)" />
<PackageVersion Include="Volo.Abp.EntityFrameworkCore.MySQL" Version="$(VoloAbpPackageVersion)" />
<PackageVersion Include="Volo.Abp.EntityFrameworkCore.MySQL.Pomelo" Version="$(VoloAbpPackageVersion)" />
<PackageVersion Include="Volo.Abp.EntityFrameworkCore.SqlServer" Version="$(VoloAbpPackageVersion)" />
<PackageVersion Include="Volo.Abp.EntityFrameworkCore.PostgreSql" Version="$(VoloAbpPackageVersion)" />
<PackageVersion Include="Volo.Abp.Features" Version="$(VoloAbpPackageVersion)" />
<PackageVersion Include="Volo.Abp.FeatureManagement.Application" Version="$(VoloAbpPackageVersion)" />
<PackageVersion Include="Volo.Abp.FeatureManagement.Application.Contracts" Version="$(VoloAbpPackageVersion)" />
<PackageVersion Include="Volo.Abp.FeatureManagement.Domain" Version="$(VoloAbpPackageVersion)" />
<PackageVersion Include="Volo.Abp.FeatureManagement.Domain.Shared" Version="$(VoloAbpPackageVersion)" />
<PackageVersion Include="Volo.Abp.FeatureManagement.EntityFrameworkCore" Version="$(VoloAbpPackageVersion)" />
<PackageVersion Include="Volo.Abp.FeatureManagement.HttpApi" Version="$(VoloAbpPackageVersion)" />
<PackageVersion Include="Volo.Abp.FeatureManagement.Web" Version="$(VoloAbpPackageVersion)" />
<PackageVersion Include="Volo.Abp.Emailing" Version="$(VoloAbpPackageVersion)" />
<PackageVersion Include="Volo.Abp.EventBus" Version="$(VoloAbpPackageVersion)" />
<PackageVersion Include="Volo.Abp.EventBus.Abstractions" Version="$(VoloAbpPackageVersion)" />
<PackageVersion Include="Volo.Abp.ExceptionHandling" Version="$(VoloAbpPackageVersion)" />
<PackageVersion Include="Volo.Abp.Guids" Version="$(VoloAbpPackageVersion)" />
<PackageVersion Include="Volo.Abp.Gdpr.Abstractions" Version="$(VoloAbpPackageVersion)" />
<PackageVersion Include="Volo.Abp.GlobalFeatures" Version="$(VoloAbpPackageVersion)" />
<PackageVersion Include="Volo.Abp.HangFire" Version="$(VoloAbpPackageVersion)" />
<PackageVersion Include="Volo.Abp.Http.Client" Version="$(VoloAbpPackageVersion)" />
<PackageVersion Include="Volo.Abp.Http.Client.IdentityModel.Web" Version="$(VoloAbpPackageVersion)" />
<PackageVersion Include="Volo.Abp.Identity.AspNetCore" Version="$(VoloAbpPackageVersion)" />
<PackageVersion Include="Volo.Abp.Identity.Application" Version="$(VoloAbpPackageVersion)" />
<PackageVersion Include="Volo.Abp.Identity.Application.Contracts" Version="$(VoloAbpPackageVersion)" />
<PackageVersion Include="Volo.Abp.Identity.Domain" Version="$(VoloAbpPackageVersion)" />
<PackageVersion Include="Volo.Abp.Identity.Domain.Shared" Version="$(VoloAbpPackageVersion)" />
<PackageVersion Include="Volo.Abp.Identity.EntityFrameworkCore" Version="$(VoloAbpPackageVersion)" />
<PackageVersion Include="Volo.Abp.Identity.HttpApi" Version="$(VoloAbpPackageVersion)" />
<PackageVersion Include="Volo.Abp.Identity.HttpApi.Client" Version="$(VoloAbpPackageVersion)" />
<PackageVersion Include="Volo.Abp.Identity.Web" Version="$(VoloAbpPackageVersion)" />
<PackageVersion Include="Volo.Abp.IdentityServer.Application" Version="$(VoloAbpPackageVersion)" />
<PackageVersion Include="Volo.Abp.IdentityServer.Application.Contracts" Version="$(VoloAbpPackageVersion)" />
<PackageVersion Include="Volo.Abp.IdentityServer.Domain" Version="$(VoloAbpPackageVersion)" />
<PackageVersion Include="Volo.Abp.IdentityServer.Domain.Shared" Version="$(VoloAbpPackageVersion)" />
<PackageVersion Include="Volo.Abp.IdentityServer.EntityFrameworkCore" Version="$(VoloAbpPackageVersion)" />
<PackageVersion Include="Volo.Abp.IdentityServer.HttpApi" Version="$(VoloAbpPackageVersion)" />
<PackageVersion Include="Volo.Abp.Imaging.Abstractions" Version="$(VoloAbpPackageVersion)" />
<PackageVersion Include="Volo.Abp.Imaging.ImageSharp" Version="$(VoloAbpPackageVersion)" />
<PackageVersion Include="Volo.Abp.Json" Version="$(VoloAbpPackageVersion)" />
<PackageVersion Include="Volo.Abp.Json.Abstractions" Version="$(VoloAbpPackageVersion)" />
<PackageVersion Include="Volo.Abp.Localization" Version="$(VoloAbpPackageVersion)" />
<PackageVersion Include="Volo.Abp.MailKit" Version="$(VoloAbpPackageVersion)" />
<PackageVersion Include="Volo.Abp.MultiTenancy" Version="$(VoloAbpPackageVersion)" />
<PackageVersion Include="Volo.Abp.MultiTenancy.Abstractions" Version="$(VoloAbpPackageVersion)" />
<PackageVersion Include="Volo.Abp.ObjectExtending" Version="$(VoloAbpPackageVersion)" />
<PackageVersion Include="Volo.Abp.OpenIddict.Application" Version="$(VoloAbpPackageVersion)" />
<PackageVersion Include="Volo.Abp.OpenIddict.Application.Contracts" Version="$(VoloAbpPackageVersion)" />
<PackageVersion Include="Volo.Abp.OpenIddict.AspNetCore" Version="$(VoloAbpPackageVersion)" />
<PackageVersion Include="Volo.Abp.OpenIddict.Domain" Version="$(VoloAbpPackageVersion)" />
<PackageVersion Include="Volo.Abp.OpenIddict.Domain.Shared" Version="$(VoloAbpPackageVersion)" />
<PackageVersion Include="Volo.Abp.OpenIddict.EntityFrameworkCore" Version="$(VoloAbpPackageVersion)" />
<PackageVersion Include="Volo.Abp.OpenIddict.HttpApi" Version="$(VoloAbpPackageVersion)" />
<PackageVersion Include="Volo.Abp.PermissionManagement.Application" Version="$(VoloAbpPackageVersion)" />
<PackageVersion Include="Volo.Abp.PermissionManagement.Application.Contracts" Version="$(VoloAbpPackageVersion)" />
<PackageVersion Include="Volo.Abp.PermissionManagement.Domain" Version="$(VoloAbpPackageVersion)" />
<PackageVersion Include="Volo.Abp.PermissionManagement.Domain.Identity" Version="$(VoloAbpPackageVersion)" />
<PackageVersion Include="Volo.Abp.PermissionManagement.Domain.IdentityServer" Version="$(VoloAbpPackageVersion)" />
<PackageVersion Include="Volo.Abp.PermissionManagement.Domain.OpenIddict" Version="$(VoloAbpPackageVersion)" />
<PackageVersion Include="Volo.Abp.PermissionManagement.Domain.Shared" Version="$(VoloAbpPackageVersion)" />
<PackageVersion Include="Volo.Abp.PermissionManagement.EntityFrameworkCore" Version="$(VoloAbpPackageVersion)" />
<PackageVersion Include="Volo.Abp.PermissionManagement.HttpApi" Version="$(VoloAbpPackageVersion)" />
<PackageVersion Include="Volo.Abp.PermissionManagement.Web" Version="$(VoloAbpPackageVersion)" />
<PackageVersion Include="Volo.Abp.Quartz" Version="$(VoloAbpPackageVersion)" />
<PackageVersion Include="Volo.Abp.Security" Version="$(VoloAbpPackageVersion)" />
<PackageVersion Include="Volo.Abp.Settings" Version="$(VoloAbpPackageVersion)" />
<PackageVersion Include="Volo.Abp.SettingManagement.Application" Version="$(VoloAbpPackageVersion)" />
<PackageVersion Include="Volo.Abp.SettingManagement.Application.Contracts" Version="$(VoloAbpPackageVersion)" />
<PackageVersion Include="Volo.Abp.SettingManagement.Domain" Version="$(VoloAbpPackageVersion)" />
<PackageVersion Include="Volo.Abp.SettingManagement.Domain.Shared" Version="$(VoloAbpPackageVersion)" />
<PackageVersion Include="Volo.Abp.SettingManagement.EntityFrameworkCore" Version="$(VoloAbpPackageVersion)" />
<PackageVersion Include="Volo.Abp.SettingManagement.HttpApi" Version="$(VoloAbpPackageVersion)" />
<PackageVersion Include="Volo.Abp.SettingManagement.Web" Version="$(VoloAbpPackageVersion)" />
<PackageVersion Include="Volo.Abp.Swashbuckle" Version="$(VoloAbpPackageVersion)" />
<PackageVersion Include="Volo.Abp.Sms" Version="$(VoloAbpPackageVersion)" />
<PackageVersion Include="Volo.Abp.TestBase" Version="$(VoloAbpPackageVersion)" />
<PackageVersion Include="Volo.Abp.TextTemplating.Core" Version="$(VoloAbpPackageVersion)" />
<PackageVersion Include="Volo.Abp.TextTemplating.Scriban" Version="$(VoloAbpPackageVersion)" />
<PackageVersion Include="Volo.Abp.Timing" Version="$(VoloAbpPackageVersion)" />
<PackageVersion Include="Volo.Abp.Threading" Version="$(VoloAbpPackageVersion)" />
<PackageVersion Include="Volo.Abp.UI.Navigation" Version="$(VoloAbpPackageVersion)" />
<PackageVersion Include="Volo.Abp.Users.Abstractions" Version="$(VoloAbpPackageVersion)" />
<PackageVersion Include="Volo.Abp.Users.Domain.Shared" Version="$(VoloAbpPackageVersion)" />
<PackageVersion Include="Volo.Abp.Validation" Version="$(VoloAbpPackageVersion)" />
<PackageVersion Include="Volo.Abp.VirtualFileSystem" Version="$(VoloAbpPackageVersion)" />
<PackageVersion Include="Volo.Abp.VirtualFileExplorer.Web" Version="$(VoloAbpPackageVersion)" />
</ItemGroup>
<!-- .NET -->
<ItemGroup>
<PackageVersion Include="Microsoft.AspNetCore.Authentication.JwtBearer" Version="$(MicrosoftAspNetCorePackageVersion)" />
<PackageVersion Include="Microsoft.AspNetCore.Authentication.OpenIdConnect" Version="$(MicrosoftAspNetCorePackageVersion)" />
<PackageVersion Include="Microsoft.AspNetCore.DataProtection.StackExchangeRedis" Version="$(MicrosoftAspNetCorePackageVersion)" />
<PackageVersion Include="Microsoft.AspNetCore.SignalR.Protocols.Json" Version="$(MicrosoftAspNetCorePackageVersion)" />
<PackageVersion Include="Microsoft.AspNetCore.SignalR.StackExchangeRedis" Version="$(MicrosoftAspNetCorePackageVersion)" />
<PackageVersion Include="Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation" Version="$(MicrosoftAspNetCorePackageVersion)" />
<PackageVersion Include="Microsoft.Bcl.AsyncInterfaces" Version="9.0.5" />
<PackageVersion Include="Microsoft.CSharp" Version="4.7.0" />
<PackageVersion Include="Microsoft.EntityFrameworkCore.Design" Version="$(MicrosoftEntityFrameworkCorePackageVersion)" />
<PackageVersion Include="Microsoft.EntityFrameworkCore.InMemory" Version="$(MicrosoftEntityFrameworkCorePackageVersion)" />
<PackageVersion Include="Microsoft.EntityFrameworkCore.Tools" Version="$(MicrosoftEntityFrameworkCorePackageVersion)" />
<PackageVersion Include="Microsoft.EntityFrameworkCore.Relational" Version="$(MicrosoftEntityFrameworkCorePackageVersion)" />
<PackageVersion Include="Microsoft.Extensions.Caching.Memory" Version="$(MicrosoftExtensionsPackageVersion)" />
<PackageVersion Include="Microsoft.Extensions.Configuration.UserSecrets" Version="$(MicrosoftExtensionsPackageVersion)" />
<PackageVersion Include="Microsoft.Extensions.Configuration.Binder" Version="$(MicrosoftExtensionsPackageVersion)" />
<PackageVersion Include="Microsoft.Extensions.FileProviders.Embedded" Version="$(MicrosoftExtensionsPackageVersion)" />
<PackageVersion Include="Microsoft.Extensions.FileProviders.Physical" Version="$(MicrosoftExtensionsPackageVersion)" />
<PackageVersion Include="Microsoft.Extensions.Http" Version="$(MicrosoftExtensionsPackageVersion)" />
<PackageVersion Include="Microsoft.Extensions.Http.Polly" Version="$(MicrosoftExtensionsPackageVersion)" />
<PackageVersion Include="Microsoft.Extensions.Http.Resilience" Version="$(MicrosoftExtensionsPackageVersion)" />
<PackageVersion Include="Microsoft.Extensions.Hosting" Version="$(MicrosoftExtensionsPackageVersion)" />
<PackageVersion Include="Microsoft.Extensions.Options" Version="$(MicrosoftExtensionsPackageVersion)" />
<PackageVersion Include="Microsoft.Extensions.ServiceDiscovery" Version="$(MicrosoftExtensionsPackageVersion)" />
<PackageVersion Include="Microsoft.CodeAnalysis.Common" Version="4.5.0" />
<PackageVersion Include="Microsoft.CodeAnalysis.CSharp" Version="4.5.0" />
<PackageVersion Include="MySql.EntityFrameworkCore" Version="9.0.6" />
<PackageVersion Include="Pomelo.EntityFrameworkCore.MySql" Version="9.0.0" />
<PackageVersion Include="Pomelo.EntityFrameworkCore.MySql.Json.Microsoft" Version="9.0.0" />
</ItemGroup>
<!-- Aspire -->
<ItemGroup>
<PackageVersion Include="Aspire.Hosting.Elasticsearch" Version="13.0.0" />
<PackageVersion Include="Aspire.Hosting.JavaScript" Version="$(AspirePackageVersion)" />
<PackageVersion Include="Aspire.Hosting.MySql" Version="$(AspirePackageVersion)" />
<PackageVersion Include="Aspire.Hosting.PostgreSQL" Version="$(AspirePackageVersion)" />
<PackageVersion Include="Aspire.Hosting.RabbitMQ" Version="$(AspirePackageVersion)" />
<PackageVersion Include="Aspire.Hosting.Redis" Version="$(AspirePackageVersion)" />
<PackageVersion Include="Aspire.MySqlConnector" Version="$(AspirePackageVersion)" />
<PackageVersion Include="Aspire.Pomelo.EntityFrameworkCore.MySql" Version="$(AspirePackageVersion)" />
<PackageVersion Include="Aspire.StackExchange.Redis" Version="$(AspirePackageVersion)" />
<PackageVersion Include="Aspire.RabbitMQ.Client" Version="$(AspirePackageVersion)" />
<PackageVersion Include="Aspire.Elastic.Clients.Elasticsearch" Version="13.0.0" />
</ItemGroup>
<!-- Elsa -->
<ItemGroup>
<PackageVersion Include="Elsa" Version="$(ElsaPackageVersion)" />
<PackageVersion Include="Elsa.Activities.Email" Version="$(ElsaPackageVersion)" />
<PackageVersion Include="Elsa.Activities.Http" Version="$(ElsaPackageVersion)" />
<PackageVersion Include="Elsa.Activities.UserTask" Version="$(ElsaPackageVersion)" />
<PackageVersion Include="Elsa.Activities.Temporal.Quartz" Version="$(ElsaPackageVersion)" />
<PackageVersion Include="Elsa.Core" Version="$(ElsaPackageVersion)" />
<PackageVersion Include="Elsa.Designer.Components.Web" Version="$(ElsaPackageVersion)" />
<PackageVersion Include="Elsa.Rebus.RabbitMq" Version="$(ElsaPackageVersion)" />
<PackageVersion Include="Elsa.Server.Api" Version="$(ElsaPackageVersion)" />
<PackageVersion Include="Elsa.Server.Authentication" Version="$(ElsaPackageVersion)" />
<PackageVersion Include="Elsa.Webhooks.Api" Version="$(ElsaPackageVersion)" />
<PackageVersion Include="Elsa.Webhooks.Persistence.EntityFramework.Core" Version="$(ElsaPackageVersion)" />
<PackageVersion Include="Elsa.WorkflowSettings.Persistence.EntityFramework.Core" Version="$(ElsaPackageVersion)" />
<PackageVersion Include="Elsa.Webhooks.Persistence.EntityFramework.MySql" Version="$(ElsaPackageVersion)" />
<PackageVersion Include="Elsa.WorkflowSettings.Persistence.EntityFramework.MySql" Version="$(ElsaPackageVersion)" />
<PackageVersion Include="Elsa.Webhooks.Persistence.EntityFramework.PostgreSql" Version="$(ElsaPackageVersion)" />
<PackageVersion Include="Elsa.WorkflowSettings.Persistence.EntityFramework.PostgreSql" Version="$(ElsaPackageVersion)" />
<PackageVersion Include="Elsa.Webhooks.Persistence.EntityFramework.SqlServer" Version="$(ElsaPackageVersion)" />
<PackageVersion Include="Elsa.WorkflowSettings.Persistence.EntityFramework.SqlServer" Version="$(ElsaPackageVersion)" />
</ItemGroup>
<!-- Elsa Next-->
<ItemGroup>
<PackageVersion Include="Elsa.Api.Client" Version="$(ElsaNextPackageVersion)" />
<PackageVersion Include="Elsa.Studio" Version="$(ElsaNextPackageVersion)" />
<PackageVersion Include="Elsa.Studio.Core.BlazorServer" Version="$(ElsaNextPackageVersion)" />
<PackageVersion Include="Elsa.Studio.Login.BlazorServer" Version="$(ElsaNextPackageVersion)" />
<PackageVersion Include="Elsa.Studio.Localization.BlazorServer" Version="$(ElsaNextPackageVersion)" />
<PackageVersion Include="Elsa.Studio.Core.BlazorWasm" Version="$(ElsaNextPackageVersion)" />
<PackageVersion Include="Elsa.Studio.Login.BlazorWasm" Version="$(ElsaNextPackageVersion)" />
<PackageVersion Include="Elsa.Studio.Translations" Version="$(ElsaNextPackageVersion)" />
<PackageVersion Include="Elsa.Studio.Agents" Version="$(ElsaNextPackageVersion)" />
<PackageVersion Include="Microsoft.AspNetCore.Components.WebAssembly" Version="$(MicrosoftAspNetCorePackageVersion)" />
<PackageVersion Include="Microsoft.AspNetCore.Components.WebAssembly.DevServer" Version="$(MicrosoftAspNetCorePackageVersion)" />
<PackageVersion Include="Microsoft.AspNetCore.Components.WebAssembly.Server" Version="$(MicrosoftAspNetCorePackageVersion)" />
</ItemGroup>
<!-- DotNetCore.CAP -->
<ItemGroup>
<PackageVersion Include="DotNetCore.CAP" Version="$(DotNetCoreCAPPackageVersion)" />
<PackageVersion Include="DotNetCore.CAP.Dashboard" Version="$(DotNetCoreCAPPackageVersion)" />
<PackageVersion Include="DotNetCore.CAP.MySql" Version="$(DotNetCoreCAPPackageVersion)" />
<PackageVersion Include="DotNetCore.CAP.SqlServer" Version="$(DotNetCoreCAPPackageVersion)" />
<PackageVersion Include="DotNetCore.CAP.PostgreSql" Version="$(DotNetCoreCAPPackageVersion)" />
<PackageVersion Include="DotNetCore.CAP.OpenTelemetry" Version="$(DotNetCoreCAPPackageVersion)" />
<PackageVersion Include="DotNetCore.CAP.RabbitMQ" Version="$(DotNetCoreCAPPackageVersion)" />
<PackageVersion Include="DotNetCore.CAP.InMemoryStorage" Version="$(DotNetCoreCAPPackageVersion)" />
<PackageVersion Include="DotNetCore.CAP.RedisStreams" Version="$(DotNetCoreCAPPackageVersion)" />
<PackageVersion Include="Savorboard.CAP.InMemoryMessageQueue" Version="$(DotNetCoreCAPPackageVersion)" />
</ItemGroup>
<!-- Serilog -->
<ItemGroup>
<PackageVersion Include="Serilog" Version="4.2.0" />
<PackageVersion Include="Serilog.AspNetCore" Version="9.0.0" />
<PackageVersion Include="Serilog.Enrichers.Environment" Version="3.0.1" />
<PackageVersion Include="Serilog.Enrichers.Assembly" Version="2.0.0" />
<PackageVersion Include="Serilog.Enrichers.Process" Version="3.0.0" />
<PackageVersion Include="Serilog.Enrichers.Thread" Version="4.0.0" />
<PackageVersion Include="Serilog.Extensions.Hosting" Version="9.0.0" />
<PackageVersion Include="Serilog.Extensions.Logging" Version="9.0.1" />
<PackageVersion Include="Serilog.Settings.Configuration" Version="9.0.0" />
<PackageVersion Include="Serilog.Sinks.Async" Version="2.1.0" />
<PackageVersion Include="Serilog.Sinks.Console" Version="6.0.0" />
<PackageVersion Include="Serilog.Sinks.Elasticsearch" Version="9.0.3" />
<PackageVersion Include="Serilog.Sinks.File" Version="7.0.0" />
<PackageVersion Include="Serilog.Sinks.OpenTelemetry" Version="4.0.0-dev-00313" />
</ItemGroup>
<!-- OpenTelemetry -->
<ItemGroup>
<PackageVersion Include="OpenTelemetry.Extensions.Hosting" Version="1.14.0" />
<PackageVersion Include="OpenTelemetry.Exporter.Console" Version="1.14.0" />
<PackageVersion Include="OpenTelemetry.Exporter.OpenTelemetryProtocol" Version="1.14.0" />
<PackageVersion Include="OpenTelemetry.Exporter.Zipkin" Version="1.14.0" />
<PackageVersion Include="OpenTelemetry.Instrumentation.AspNetCore" Version="1.14.0" />
<PackageVersion Include="OpenTelemetry.Instrumentation.Http" Version="1.14.0" />
<PackageVersion Include="OpenTelemetry.Instrumentation.EntityFrameworkCore" Version="1.14.0-beta.2" />
<PackageVersion Include="OpenTelemetry.Instrumentation.Quartz" Version="1.14.0-beta.2" />
<PackageVersion Include="OpenTelemetry.Instrumentation.Runtime" Version="1.14.0" />
<PackageVersion Include="OpenTelemetry.Instrumentation.SqlClient" Version="1.14.0-beta.1" />
</ItemGroup>
<!-- Test -->
<ItemGroup>
<PackageVersion Include="coverlet.collector" Version="6.0.4" />
<PackageVersion Include="Microsoft.NET.Test.Sdk" Version="17.13.0" />
<PackageVersion Include="Moq.AutoMock" Version="3.5.0" />
<PackageVersion Include="NSubstitute" Version="5.3.0" />
<PackageVersion Include="Shouldly" Version="4.3.0" />
<PackageVersion Include="xunit" Version="2.9.3" />
<PackageVersion Include="xunit.extensibility.execution" Version="2.9.3" />
<PackageVersion Include="xunit.runner.visualstudio" Version="3.0.2" />
</ItemGroup>
<!-- Fody -->
<ItemGroup>
<PackageVersion Include="ConfigureAwait.Fody" Version="3.3.2" />
<PackageVersion Include="Fody" Version="6.9.2" />
</ItemGroup>
<!-- DataBase -->
<ItemGroup>
<PackageVersion Include="MySqlConnector" Version="2.4.0" />
<PackageVersion Include="Oracle.ManagedDataAccess.Core" Version="23.6.1" />
<PackageVersion Include="Npgsql" Version="9.0.3" />
<PackageVersion Include="Microsoft.Data.SqlClient" Version="5.1.6" />
<PackageVersion Include="Microsoft.Data.Sqlite.Core" Version="9.0.5" />
</ItemGroup>
<!-- Other -->
<ItemGroup>
<PackageVersion Include="AspNet.Security.OAuth.Bilibili" Version="9.4.0" />
<PackageVersion Include="AspNet.Security.OAuth.GitHub" Version="9.4.0" />
<PackageVersion Include="AspNet.Security.OAuth.QQ" Version="9.4.0" />
<PackageVersion Include="AspNet.Security.OAuth.Weixin" Version="9.4.0" />
<PackageVersion Include="AspNet.Security.OAuth.WorkWeixin" Version="9.4.0" />
<PackageVersion Include="Microsoft.AspNetCore.Authentication.Google" Version="$(MicrosoftAspNetCorePackageVersion)" />
<PackageVersion Include="Microsoft.AspNetCore.Authentication.MicrosoftAccount" Version="$(MicrosoftAspNetCorePackageVersion)" />
<PackageVersion Include="Microsoft.AspNetCore.Authentication.Twitter" Version="$(MicrosoftAspNetCorePackageVersion)" />
<PackageVersion Include="Microsoft.IdentityModel.Tokens" Version="8.12.0" />
<PackageVersion Include="aliyun-net-sdk-core" Version="1.5.10" />
<PackageVersion Include="Aliyun.OSS.SDK.NetCore" Version="2.14.1" />
<PackageVersion Include="AgileConfig.Client" Version="1.6.9" />
<PackageVersion Include="CommonMark.NET" Version="0.15.1" />
<PackageVersion Include="Elastic.Apm.NetCoreAll" Version="1.31.0" />
<PackageVersion Include="BouncyCastle.Cryptography" Version="2.5.0" />
<PackageVersion Include="Dapr.Client" Version="1.15.4" />
<PackageVersion Include="Dapr.Actors" Version="1.15.4" />
<PackageVersion Include="Dapr.Actors.AspNetCore" Version="1.15.4" />
<PackageVersion Include="DistributedLock.Core" Version="1.0.8" />
<PackageVersion Include="DistributedLock.Redis" Version="1.0.3" />
<PackageVersion Include="Hangfire.MySqlStorage" Version="2.0.3" />
<PackageVersion Include="HangFire.SqlServer" Version="1.8.18" />
<PackageVersion Include="IdentityModel" Version="7.0.0" />
<PackageVersion Include="IP2Region.Net" Version="2.0.2" />
<PackageVersion Include="JetBrains.Annotations" Version="2024.3.0" />
<PackageVersion Include="Magicodes.IE.Excel" Version="2.7.5.2" />
<PackageVersion Include="Markdig" Version="0.34.0" />
<PackageVersion Include="MiniExcel" Version="1.34.2" />
<PackageVersion Include="Newtonsoft.Json" Version="13.0.3" />
<PackageVersion Include="NEST" Version="7.17.5" />
<PackageVersion Include="NRules" Version="0.9.2" />
<PackageVersion Include="Ocelot.Provider.Polly" Version="20.0.0" />
<PackageVersion Include="OpenIddict.Server.DataProtection" Version="6.4.0" />
<PackageVersion Include="OpenIddict.Validation.DataProtection" Version="6.4.0" />
<PackageVersion Include="Polly" Version="8.5.2" />
<PackageVersion Include="QRCoder" Version="1.5.1" />
<PackageVersion Include="Quartz.Serialization.Json" Version="3.14.0" />
<PackageVersion Include="Rebus.RabbitMq" Version="10.0.1" />
<PackageVersion Include="RulesEngine" Version="5.0.5" />
<PackageVersion Include="Scriban" Version="6.2.1" />
<PackageVersion Include="Senparc.Weixin.MP" Version="16.18.9" />
<PackageVersion Include="SkyApm.Agent.Hosting" Version="2.2.0" />
<PackageVersion Include="SkyApm.Diagnostics.AspNetCore" Version="2.2.0" />
<PackageVersion Include="SkyAPM.Diagnostics.CAP" Version="2.2.0" />
<PackageVersion Include="SixLabors.ImageSharp" Version="3.1.8" />
<PackageVersion Include="SixLabors.ImageSharp.Drawing" Version="2.1.6" />
<PackageVersion Include="StackExchange.Redis" Version="2.8.31" />
<PackageVersion Include="Spire.XLS" Version="15.5.1" />
<PackageVersion Include="Swashbuckle.AspNetCore" Version="8.1.1" />
<PackageVersion Include="System.ComponentModel.Annotations" Version="5.0.0" />
<PackageVersion Include="Tencent.QCloud.Cos.Sdk" Version="5.4.37" />
<PackageVersion Include="TencentCloudSDK" Version="3.0.712" />
<PackageVersion Include="Yarp.ReverseProxy" Version="2.1.0" />
<PackageVersion Include="Yarp.Telemetry.Consumption" Version="2.1.0" />
</ItemGroup>
</Project>
<PropertyGroup>
<DotNetCoreCAPPackageVersion>10.0.0</DotNetCoreCAPPackageVersion>
<ElsaPackageVersion>2.15.2</ElsaPackageVersion>
<ElsaNextPackageVersion>3.3.5</ElsaNextPackageVersion>
<VoloAbpPackageVersion>10.0.2</VoloAbpPackageVersion>
<LINGYUNAbpPackageVersion>10.0.2</LINGYUNAbpPackageVersion>
<MicrosoftExtensionsPackageVersion>10.0.0</MicrosoftExtensionsPackageVersion>
<MicrosoftAspNetCorePackageVersion>10.0.0</MicrosoftAspNetCorePackageVersion>
<MicrosoftEntityFrameworkCorePackageVersion>10.0.0</MicrosoftEntityFrameworkCorePackageVersion>
<AspirePackageVersion>13.1.0</AspirePackageVersion>
<ManagePackageVersionsCentrally>true</ManagePackageVersionsCentrally>
</PropertyGroup>
<!-- Abp Framework -->
<ItemGroup>
<PackageVersion Include="Volo.Abp.AspNetCore.Mvc.UI.Theme.LeptonXLite" Version="5.0.2" />
<PackageVersion Include="Volo.Abp.Core" Version="$(VoloAbpPackageVersion)" />
<PackageVersion Include="Volo.Abp.Account.Application" Version="$(VoloAbpPackageVersion)" />
<PackageVersion Include="Volo.Abp.Account.Application.Contracts" Version="$(VoloAbpPackageVersion)" />
<PackageVersion Include="Volo.Abp.Account.Domain" Version="$(VoloAbpPackageVersion)" />
<PackageVersion Include="Volo.Abp.Account.Domain.Shared" Version="$(VoloAbpPackageVersion)" />
<PackageVersion Include="Volo.Abp.Account.EntityFrameworkCore" Version="$(VoloAbpPackageVersion)" />
<PackageVersion Include="Volo.Abp.Account.HttpApi" Version="$(VoloAbpPackageVersion)" />
<PackageVersion Include="Volo.Abp.Account.HttpApi.Client" Version="$(VoloAbpPackageVersion)" />
<PackageVersion Include="Volo.Abp.Account.Web" Version="$(VoloAbpPackageVersion)" />
<PackageVersion Include="Volo.Abp.Account.Web.IdentityServer" Version="$(VoloAbpPackageVersion)" />
<PackageVersion Include="Volo.Abp.Account.Web.OpenIddict" Version="$(VoloAbpPackageVersion)" />
<PackageVersion Include="Volo.Abp.AspNetCore" Version="$(VoloAbpPackageVersion)" />
<PackageVersion Include="Volo.Abp.AspNetCore.Authentication.JwtBearer" Version="$(VoloAbpPackageVersion)" />
<PackageVersion Include="Volo.Abp.AspNetCore.MultiTenancy" Version="$(VoloAbpPackageVersion)" />
<PackageVersion Include="Volo.Abp.AspNetCore.Mvc" Version="$(VoloAbpPackageVersion)" />
<PackageVersion Include="Volo.Abp.AspNetCore.Mvc.Client.Common" Version="$(VoloAbpPackageVersion)" />
<PackageVersion Include="Volo.Abp.AspNetCore.Mvc.Contracts" Version="$(VoloAbpPackageVersion)" />
<PackageVersion Include="Volo.Abp.AspNetCore.Mvc.NewtonsoftJson" Version="$(VoloAbpPackageVersion)" />
<PackageVersion Include="Volo.Abp.AspNetCore.Mvc.UI.MultiTenancy" Version="$(VoloAbpPackageVersion)" />
<PackageVersion Include="Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic" Version="$(VoloAbpPackageVersion)" />
<PackageVersion Include="Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared" Version="$(VoloAbpPackageVersion)" />
<PackageVersion Include="Volo.Abp.AspNetCore.Serilog" Version="$(VoloAbpPackageVersion)" />
<PackageVersion Include="Volo.Abp.AspNetCore.SignalR" Version="$(VoloAbpPackageVersion)" />
<PackageVersion Include="Volo.Abp.AspNetCore.TestBase" Version="$(VoloAbpPackageVersion)" />
<PackageVersion Include="Volo.Abp.Auditing" Version="$(VoloAbpPackageVersion)" />
<PackageVersion Include="Volo.Abp.Auditing.Contracts" Version="$(VoloAbpPackageVersion)" />
<PackageVersion Include="Volo.Abp.AuditLogging.Domain.Shared" Version="$(VoloAbpPackageVersion)" />
<PackageVersion Include="Volo.Abp.AuditLogging.EntityFrameworkCore" Version="$(VoloAbpPackageVersion)" />
<PackageVersion Include="Volo.Abp.Authorization" Version="$(VoloAbpPackageVersion)" />
<PackageVersion Include="Volo.Abp.Authorization.Abstractions" Version="$(VoloAbpPackageVersion)" />
<PackageVersion Include="Volo.Abp.Autofac" Version="$(VoloAbpPackageVersion)" />
<PackageVersion Include="Volo.Abp.AutoMapper" Version="$(VoloAbpPackageVersion)" />
<PackageVersion Include="Volo.Abp.BackgroundJobs" Version="$(VoloAbpPackageVersion)" />
<PackageVersion Include="Volo.Abp.BackgroundJobs.Abstractions" Version="$(VoloAbpPackageVersion)" />
<PackageVersion Include="Volo.Abp.BackgroundWorkers" Version="$(VoloAbpPackageVersion)" />
<PackageVersion Include="Volo.Abp.BlobStoring" Version="$(VoloAbpPackageVersion)" />
<PackageVersion Include="Volo.Abp.BlobStoring.FileSystem" Version="$(VoloAbpPackageVersion)" />
<PackageVersion Include="Volo.Abp.BlobStoring.Minio" Version="$(VoloAbpPackageVersion)" />
<PackageVersion Include="Volo.Abp.Caching" Version="$(VoloAbpPackageVersion)" />
<PackageVersion Include="Volo.Abp.Caching.StackExchangeRedis" Version="$(VoloAbpPackageVersion)" />
<PackageVersion Include="Volo.Abp.Cli.Core" Version="$(VoloAbpPackageVersion)" />
<PackageVersion Include="Volo.Abp.Data" Version="$(VoloAbpPackageVersion)" />
<PackageVersion Include="Volo.Abp.Dapper" Version="$(VoloAbpPackageVersion)" />
<PackageVersion Include="Volo.Abp.Ddd.Application" Version="$(VoloAbpPackageVersion)" />
<PackageVersion Include="Volo.Abp.Ddd.Application.Contracts" Version="$(VoloAbpPackageVersion)" />
<PackageVersion Include="Volo.Abp.Ddd.Domain" Version="$(VoloAbpPackageVersion)" />
<PackageVersion Include="Volo.Abp.Ddd.Domain.Shared" Version="$(VoloAbpPackageVersion)" />
<PackageVersion Include="Volo.Abp.DistributedLocking.Abstractions" Version="$(VoloAbpPackageVersion)" />
<PackageVersion Include="Volo.Abp.DistributedLocking" Version="$(VoloAbpPackageVersion)" />
<PackageVersion Include="Volo.Abp.EntityFrameworkCore" Version="$(VoloAbpPackageVersion)" />
<PackageVersion Include="Volo.Abp.EntityFrameworkCore.MySQL" Version="$(VoloAbpPackageVersion)" />
<PackageVersion Include="Volo.Abp.EntityFrameworkCore.MySQL.Pomelo" Version="$(VoloAbpPackageVersion)" />
<PackageVersion Include="Volo.Abp.EntityFrameworkCore.SqlServer" Version="$(VoloAbpPackageVersion)" />
<PackageVersion Include="Volo.Abp.EntityFrameworkCore.PostgreSql" Version="$(VoloAbpPackageVersion)" />
<PackageVersion Include="Volo.Abp.Features" Version="$(VoloAbpPackageVersion)" />
<PackageVersion Include="Volo.Abp.FeatureManagement.Application" Version="$(VoloAbpPackageVersion)" />
<PackageVersion Include="Volo.Abp.FeatureManagement.Application.Contracts" Version="$(VoloAbpPackageVersion)" />
<PackageVersion Include="Volo.Abp.FeatureManagement.Domain" Version="$(VoloAbpPackageVersion)" />
<PackageVersion Include="Volo.Abp.FeatureManagement.Domain.Shared" Version="$(VoloAbpPackageVersion)" />
<PackageVersion Include="Volo.Abp.FeatureManagement.EntityFrameworkCore" Version="$(VoloAbpPackageVersion)" />
<PackageVersion Include="Volo.Abp.FeatureManagement.HttpApi" Version="$(VoloAbpPackageVersion)" />
<PackageVersion Include="Volo.Abp.FeatureManagement.Web" Version="$(VoloAbpPackageVersion)" />
<PackageVersion Include="Volo.Abp.Emailing" Version="$(VoloAbpPackageVersion)" />
<PackageVersion Include="Volo.Abp.EventBus" Version="$(VoloAbpPackageVersion)" />
<PackageVersion Include="Volo.Abp.EventBus.Abstractions" Version="$(VoloAbpPackageVersion)" />
<PackageVersion Include="Volo.Abp.ExceptionHandling" Version="$(VoloAbpPackageVersion)" />
<PackageVersion Include="Volo.Abp.Guids" Version="$(VoloAbpPackageVersion)" />
<PackageVersion Include="Volo.Abp.Gdpr.Abstractions" Version="$(VoloAbpPackageVersion)" />
<PackageVersion Include="Volo.Abp.GlobalFeatures" Version="$(VoloAbpPackageVersion)" />
<PackageVersion Include="Volo.Abp.HangFire" Version="$(VoloAbpPackageVersion)" />
<PackageVersion Include="Volo.Abp.Http.Client" Version="$(VoloAbpPackageVersion)" />
<PackageVersion Include="Volo.Abp.Http.Client.IdentityModel.Web" Version="$(VoloAbpPackageVersion)" />
<PackageVersion Include="Volo.Abp.Identity.AspNetCore" Version="$(VoloAbpPackageVersion)" />
<PackageVersion Include="Volo.Abp.Identity.Application" Version="$(VoloAbpPackageVersion)" />
<PackageVersion Include="Volo.Abp.Identity.Application.Contracts" Version="$(VoloAbpPackageVersion)" />
<PackageVersion Include="Volo.Abp.Identity.Domain" Version="$(VoloAbpPackageVersion)" />
<PackageVersion Include="Volo.Abp.Identity.Domain.Shared" Version="$(VoloAbpPackageVersion)" />
<PackageVersion Include="Volo.Abp.Identity.EntityFrameworkCore" Version="$(VoloAbpPackageVersion)" />
<PackageVersion Include="Volo.Abp.Identity.HttpApi" Version="$(VoloAbpPackageVersion)" />
<PackageVersion Include="Volo.Abp.Identity.HttpApi.Client" Version="$(VoloAbpPackageVersion)" />
<PackageVersion Include="Volo.Abp.Identity.Web" Version="$(VoloAbpPackageVersion)" />
<PackageVersion Include="Volo.Abp.IdentityServer.Application" Version="$(VoloAbpPackageVersion)" />
<PackageVersion Include="Volo.Abp.IdentityServer.Application.Contracts" Version="$(VoloAbpPackageVersion)" />
<PackageVersion Include="Volo.Abp.IdentityServer.Domain" Version="$(VoloAbpPackageVersion)" />
<PackageVersion Include="Volo.Abp.IdentityServer.Domain.Shared" Version="$(VoloAbpPackageVersion)" />
<PackageVersion Include="Volo.Abp.IdentityServer.EntityFrameworkCore" Version="$(VoloAbpPackageVersion)" />
<PackageVersion Include="Volo.Abp.IdentityServer.HttpApi" Version="$(VoloAbpPackageVersion)" />
<PackageVersion Include="Volo.Abp.Imaging.Abstractions" Version="$(VoloAbpPackageVersion)" />
<PackageVersion Include="Volo.Abp.Imaging.ImageSharp" Version="$(VoloAbpPackageVersion)" />
<PackageVersion Include="Volo.Abp.Json" Version="$(VoloAbpPackageVersion)" />
<PackageVersion Include="Volo.Abp.Json.Abstractions" Version="$(VoloAbpPackageVersion)" />
<PackageVersion Include="Volo.Abp.Localization" Version="$(VoloAbpPackageVersion)" />
<PackageVersion Include="Volo.Abp.MailKit" Version="$(VoloAbpPackageVersion)" />
<PackageVersion Include="Volo.Abp.Mapperly" Version="$(VoloAbpPackageVersion)" />
<PackageVersion Include="Volo.Abp.MultiTenancy" Version="$(VoloAbpPackageVersion)" />
<PackageVersion Include="Volo.Abp.MultiTenancy.Abstractions" Version="$(VoloAbpPackageVersion)" />
<PackageVersion Include="Volo.Abp.ObjectExtending" Version="$(VoloAbpPackageVersion)" />
<PackageVersion Include="Volo.Abp.OpenIddict.Application" Version="$(VoloAbpPackageVersion)" />
<PackageVersion Include="Volo.Abp.OpenIddict.Application.Contracts" Version="$(VoloAbpPackageVersion)" />
<PackageVersion Include="Volo.Abp.OpenIddict.AspNetCore" Version="$(VoloAbpPackageVersion)" />
<PackageVersion Include="Volo.Abp.OpenIddict.Domain" Version="$(VoloAbpPackageVersion)" />
<PackageVersion Include="Volo.Abp.OpenIddict.Domain.Shared" Version="$(VoloAbpPackageVersion)" />
<PackageVersion Include="Volo.Abp.OpenIddict.EntityFrameworkCore" Version="$(VoloAbpPackageVersion)" />
<PackageVersion Include="Volo.Abp.OpenIddict.HttpApi" Version="$(VoloAbpPackageVersion)" />
<PackageVersion Include="Volo.Abp.PermissionManagement.Application" Version="$(VoloAbpPackageVersion)" />
<PackageVersion Include="Volo.Abp.PermissionManagement.Application.Contracts" Version="$(VoloAbpPackageVersion)" />
<PackageVersion Include="Volo.Abp.PermissionManagement.Domain" Version="$(VoloAbpPackageVersion)" />
<PackageVersion Include="Volo.Abp.PermissionManagement.Domain.Identity" Version="$(VoloAbpPackageVersion)" />
<PackageVersion Include="Volo.Abp.PermissionManagement.Domain.IdentityServer" Version="$(VoloAbpPackageVersion)" />
<PackageVersion Include="Volo.Abp.PermissionManagement.Domain.OpenIddict" Version="$(VoloAbpPackageVersion)" />
<PackageVersion Include="Volo.Abp.PermissionManagement.Domain.Shared" Version="$(VoloAbpPackageVersion)" />
<PackageVersion Include="Volo.Abp.PermissionManagement.EntityFrameworkCore" Version="$(VoloAbpPackageVersion)" />
<PackageVersion Include="Volo.Abp.PermissionManagement.HttpApi" Version="$(VoloAbpPackageVersion)" />
<PackageVersion Include="Volo.Abp.PermissionManagement.Web" Version="$(VoloAbpPackageVersion)" />
<PackageVersion Include="Volo.Abp.Quartz" Version="$(VoloAbpPackageVersion)" />
<PackageVersion Include="Volo.Abp.Security" Version="$(VoloAbpPackageVersion)" />
<PackageVersion Include="Volo.Abp.Settings" Version="$(VoloAbpPackageVersion)" />
<PackageVersion Include="Volo.Abp.SettingManagement.Application" Version="$(VoloAbpPackageVersion)" />
<PackageVersion Include="Volo.Abp.SettingManagement.Application.Contracts" Version="$(VoloAbpPackageVersion)" />
<PackageVersion Include="Volo.Abp.SettingManagement.Domain" Version="$(VoloAbpPackageVersion)" />
<PackageVersion Include="Volo.Abp.SettingManagement.Domain.Shared" Version="$(VoloAbpPackageVersion)" />
<PackageVersion Include="Volo.Abp.SettingManagement.EntityFrameworkCore" Version="$(VoloAbpPackageVersion)" />
<PackageVersion Include="Volo.Abp.SettingManagement.HttpApi" Version="$(VoloAbpPackageVersion)" />
<PackageVersion Include="Volo.Abp.SettingManagement.Web" Version="$(VoloAbpPackageVersion)" />
<PackageVersion Include="Volo.Abp.Swashbuckle" Version="$(VoloAbpPackageVersion)" />
<PackageVersion Include="Volo.Abp.Sms" Version="$(VoloAbpPackageVersion)" />
<PackageVersion Include="Volo.Abp.TestBase" Version="$(VoloAbpPackageVersion)" />
<PackageVersion Include="Volo.Abp.TextTemplating.Core" Version="$(VoloAbpPackageVersion)" />
<PackageVersion Include="Volo.Abp.TextTemplating.Scriban" Version="$(VoloAbpPackageVersion)" />
<PackageVersion Include="Volo.Abp.Timing" Version="$(VoloAbpPackageVersion)" />
<PackageVersion Include="Volo.Abp.Threading" Version="$(VoloAbpPackageVersion)" />
<PackageVersion Include="Volo.Abp.UI.Navigation" Version="$(VoloAbpPackageVersion)" />
<PackageVersion Include="Volo.Abp.Users.Abstractions" Version="$(VoloAbpPackageVersion)" />
<PackageVersion Include="Volo.Abp.Users.Domain.Shared" Version="$(VoloAbpPackageVersion)" />
<PackageVersion Include="Volo.Abp.Validation" Version="$(VoloAbpPackageVersion)" />
<PackageVersion Include="Volo.Abp.VirtualFileSystem" Version="$(VoloAbpPackageVersion)" />
<PackageVersion Include="Volo.Abp.VirtualFileExplorer.Web" Version="$(VoloAbpPackageVersion)" />
</ItemGroup>
<!-- .NET -->
<ItemGroup>
<PackageVersion Include="Microsoft.AspNetCore.Authentication.JwtBearer" Version="$(MicrosoftAspNetCorePackageVersion)" />
<PackageVersion Include="Microsoft.AspNetCore.Authentication.OpenIdConnect" Version="$(MicrosoftAspNetCorePackageVersion)" />
<PackageVersion Include="Microsoft.AspNetCore.DataProtection.StackExchangeRedis" Version="$(MicrosoftAspNetCorePackageVersion)" />
<PackageVersion Include="Microsoft.AspNetCore.SignalR.Protocols.Json" Version="$(MicrosoftAspNetCorePackageVersion)" />
<PackageVersion Include="Microsoft.AspNetCore.SignalR.StackExchangeRedis" Version="$(MicrosoftAspNetCorePackageVersion)" />
<PackageVersion Include="Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation" Version="$(MicrosoftAspNetCorePackageVersion)" />
<PackageVersion Include="Microsoft.Bcl.AsyncInterfaces" Version="10.0.0" />
<PackageVersion Include="Microsoft.CSharp" Version="4.7.0" />
<PackageVersion Include="Microsoft.EntityFrameworkCore.Design" Version="$(MicrosoftEntityFrameworkCorePackageVersion)" />
<PackageVersion Include="Microsoft.EntityFrameworkCore.InMemory" Version="$(MicrosoftEntityFrameworkCorePackageVersion)" />
<PackageVersion Include="Microsoft.EntityFrameworkCore.Tools" Version="$(MicrosoftEntityFrameworkCorePackageVersion)" />
<PackageVersion Include="Microsoft.EntityFrameworkCore.Relational" Version="$(MicrosoftEntityFrameworkCorePackageVersion)" />
<PackageVersion Include="Microsoft.Extensions.Caching.Memory" Version="$(MicrosoftExtensionsPackageVersion)" />
<PackageVersion Include="Microsoft.Extensions.Configuration.UserSecrets" Version="$(MicrosoftExtensionsPackageVersion)" />
<PackageVersion Include="Microsoft.Extensions.Configuration.Binder" Version="$(MicrosoftExtensionsPackageVersion)" />
<PackageVersion Include="Microsoft.Extensions.FileProviders.Embedded" Version="$(MicrosoftExtensionsPackageVersion)" />
<PackageVersion Include="Microsoft.Extensions.FileProviders.Physical" Version="$(MicrosoftExtensionsPackageVersion)" />
<PackageVersion Include="Microsoft.Extensions.Http" Version="$(MicrosoftExtensionsPackageVersion)" />
<PackageVersion Include="Microsoft.Extensions.Http.Polly" Version="$(MicrosoftExtensionsPackageVersion)" />
<PackageVersion Include="Microsoft.Extensions.Http.Resilience" Version="$(MicrosoftExtensionsPackageVersion)" />
<PackageVersion Include="Microsoft.Extensions.Hosting" Version="$(MicrosoftExtensionsPackageVersion)" />
<PackageVersion Include="Microsoft.Extensions.Options" Version="$(MicrosoftExtensionsPackageVersion)" />
<PackageVersion Include="Microsoft.Extensions.ServiceDiscovery" Version="$(MicrosoftExtensionsPackageVersion)" />
<PackageVersion Include="Microsoft.CodeAnalysis.Common" Version="4.5.0" />
<PackageVersion Include="Microsoft.CodeAnalysis.CSharp" Version="4.5.0" />
<PackageVersion Include="MySql.EntityFrameworkCore" Version="10.0.0-rc" />
<PackageVersion Include="Pomelo.EntityFrameworkCore.MySql" Version="9.0.0" />
<PackageVersion Include="Pomelo.EntityFrameworkCore.MySql.Json.Microsoft" Version="9.0.0" />
</ItemGroup>
<!-- Aspire -->
<ItemGroup>
<PackageVersion Include="Aspire.Hosting.Elasticsearch" Version="13.0.0" />
<PackageVersion Include="Aspire.Hosting.JavaScript" Version="$(AspirePackageVersion)" />
<PackageVersion Include="Aspire.Hosting.MySql" Version="$(AspirePackageVersion)" />
<PackageVersion Include="Aspire.Hosting.PostgreSQL" Version="$(AspirePackageVersion)" />
<PackageVersion Include="Aspire.Hosting.RabbitMQ" Version="$(AspirePackageVersion)" />
<PackageVersion Include="Aspire.Hosting.Redis" Version="$(AspirePackageVersion)" />
<PackageVersion Include="Aspire.MySqlConnector" Version="$(AspirePackageVersion)" />
<PackageVersion Include="Aspire.Pomelo.EntityFrameworkCore.MySql" Version="$(AspirePackageVersion)" />
<PackageVersion Include="Aspire.StackExchange.Redis" Version="$(AspirePackageVersion)" />
<PackageVersion Include="Aspire.RabbitMQ.Client" Version="$(AspirePackageVersion)" />
<PackageVersion Include="Aspire.Elastic.Clients.Elasticsearch" Version="13.0.0" />
</ItemGroup>
<!-- Elsa -->
<ItemGroup>
<PackageVersion Include="Elsa" Version="$(ElsaPackageVersion)" />
<PackageVersion Include="Elsa.Activities.Email" Version="$(ElsaPackageVersion)" />
<PackageVersion Include="Elsa.Activities.Http" Version="$(ElsaPackageVersion)" />
<PackageVersion Include="Elsa.Activities.UserTask" Version="$(ElsaPackageVersion)" />
<PackageVersion Include="Elsa.Activities.Temporal.Quartz" Version="$(ElsaPackageVersion)" />
<PackageVersion Include="Elsa.Core" Version="$(ElsaPackageVersion)" />
<PackageVersion Include="Elsa.Designer.Components.Web" Version="$(ElsaPackageVersion)" />
<PackageVersion Include="Elsa.Rebus.RabbitMq" Version="$(ElsaPackageVersion)" />
<PackageVersion Include="Elsa.Server.Api" Version="$(ElsaPackageVersion)" />
<PackageVersion Include="Elsa.Server.Authentication" Version="$(ElsaPackageVersion)" />
<PackageVersion Include="Elsa.Webhooks.Api" Version="$(ElsaPackageVersion)" />
<PackageVersion Include="Elsa.Webhooks.Persistence.EntityFramework.Core" Version="$(ElsaPackageVersion)" />
<PackageVersion Include="Elsa.WorkflowSettings.Persistence.EntityFramework.Core" Version="$(ElsaPackageVersion)" />
<PackageVersion Include="Elsa.Webhooks.Persistence.EntityFramework.MySql" Version="$(ElsaPackageVersion)" />
<PackageVersion Include="Elsa.WorkflowSettings.Persistence.EntityFramework.MySql" Version="$(ElsaPackageVersion)" />
<PackageVersion Include="Elsa.Webhooks.Persistence.EntityFramework.PostgreSql" Version="$(ElsaPackageVersion)" />
<PackageVersion Include="Elsa.WorkflowSettings.Persistence.EntityFramework.PostgreSql" Version="$(ElsaPackageVersion)" />
<PackageVersion Include="Elsa.Webhooks.Persistence.EntityFramework.SqlServer" Version="$(ElsaPackageVersion)" />
<PackageVersion Include="Elsa.WorkflowSettings.Persistence.EntityFramework.SqlServer" Version="$(ElsaPackageVersion)" />
</ItemGroup>
<!-- Elsa Next-->
<ItemGroup>
<PackageVersion Include="Elsa.Api.Client" Version="$(ElsaNextPackageVersion)" />
<PackageVersion Include="Elsa.Studio" Version="$(ElsaNextPackageVersion)" />
<PackageVersion Include="Elsa.Studio.Core.BlazorServer" Version="$(ElsaNextPackageVersion)" />
<PackageVersion Include="Elsa.Studio.Login.BlazorServer" Version="$(ElsaNextPackageVersion)" />
<PackageVersion Include="Elsa.Studio.Localization.BlazorServer" Version="$(ElsaNextPackageVersion)" />
<PackageVersion Include="Elsa.Studio.Core.BlazorWasm" Version="$(ElsaNextPackageVersion)" />
<PackageVersion Include="Elsa.Studio.Login.BlazorWasm" Version="$(ElsaNextPackageVersion)" />
<PackageVersion Include="Elsa.Studio.Translations" Version="$(ElsaNextPackageVersion)" />
<PackageVersion Include="Elsa.Studio.Agents" Version="$(ElsaNextPackageVersion)" />
<PackageVersion Include="Microsoft.AspNetCore.Components.WebAssembly" Version="$(MicrosoftAspNetCorePackageVersion)" />
<PackageVersion Include="Microsoft.AspNetCore.Components.WebAssembly.DevServer" Version="$(MicrosoftAspNetCorePackageVersion)" />
<PackageVersion Include="Microsoft.AspNetCore.Components.WebAssembly.Server" Version="$(MicrosoftAspNetCorePackageVersion)" />
</ItemGroup>
<!-- DotNetCore.CAP -->
<ItemGroup>
<PackageVersion Include="DotNetCore.CAP" Version="$(DotNetCoreCAPPackageVersion)" />
<PackageVersion Include="DotNetCore.CAP.Dashboard" Version="$(DotNetCoreCAPPackageVersion)" />
<PackageVersion Include="DotNetCore.CAP.MySql" Version="$(DotNetCoreCAPPackageVersion)" />
<PackageVersion Include="DotNetCore.CAP.SqlServer" Version="$(DotNetCoreCAPPackageVersion)" />
<PackageVersion Include="DotNetCore.CAP.PostgreSql" Version="$(DotNetCoreCAPPackageVersion)" />
<PackageVersion Include="DotNetCore.CAP.OpenTelemetry" Version="$(DotNetCoreCAPPackageVersion)" />
<PackageVersion Include="DotNetCore.CAP.RabbitMQ" Version="$(DotNetCoreCAPPackageVersion)" />
<PackageVersion Include="DotNetCore.CAP.InMemoryStorage" Version="$(DotNetCoreCAPPackageVersion)" />
<PackageVersion Include="DotNetCore.CAP.RedisStreams" Version="$(DotNetCoreCAPPackageVersion)" />
<PackageVersion Include="Savorboard.CAP.InMemoryMessageQueue" Version="$(DotNetCoreCAPPackageVersion)" />
</ItemGroup>
<!-- Serilog -->
<ItemGroup>
<PackageVersion Include="Serilog" Version="4.3.0" />
<PackageVersion Include="Serilog.AspNetCore" Version="9.0.0" />
<PackageVersion Include="Serilog.Enrichers.Environment" Version="3.0.1" />
<PackageVersion Include="Serilog.Enrichers.Assembly" Version="2.0.0" />
<PackageVersion Include="Serilog.Enrichers.Process" Version="3.0.0" />
<PackageVersion Include="Serilog.Enrichers.Thread" Version="4.0.0" />
<PackageVersion Include="Serilog.Extensions.Hosting" Version="9.0.0" />
<PackageVersion Include="Serilog.Extensions.Logging" Version="9.0.1" />
<PackageVersion Include="Serilog.Settings.Configuration" Version="9.0.0" />
<PackageVersion Include="Serilog.Sinks.Async" Version="2.1.0" />
<PackageVersion Include="Serilog.Sinks.Console" Version="6.0.0" />
<PackageVersion Include="Serilog.Sinks.Elasticsearch" Version="9.0.3" />
<PackageVersion Include="Serilog.Sinks.File" Version="7.0.0" />
<PackageVersion Include="Serilog.Sinks.OpenTelemetry" Version="4.0.0-dev-00313" />
</ItemGroup>
<!-- OpenTelemetry -->
<ItemGroup>
<PackageVersion Include="OpenTelemetry.Extensions.Hosting" Version="1.14.0" />
<PackageVersion Include="OpenTelemetry.Exporter.Console" Version="1.14.0" />
<PackageVersion Include="OpenTelemetry.Exporter.OpenTelemetryProtocol" Version="1.14.0" />
<PackageVersion Include="OpenTelemetry.Exporter.Zipkin" Version="1.14.0" />
<PackageVersion Include="OpenTelemetry.Instrumentation.AspNetCore" Version="1.14.0" />
<PackageVersion Include="OpenTelemetry.Instrumentation.Http" Version="1.14.0" />
<PackageVersion Include="OpenTelemetry.Instrumentation.EntityFrameworkCore" Version="1.14.0-beta.2" />
<PackageVersion Include="OpenTelemetry.Instrumentation.Quartz" Version="1.14.0-beta.2" />
<PackageVersion Include="OpenTelemetry.Instrumentation.Runtime" Version="1.14.0" />
<PackageVersion Include="OpenTelemetry.Instrumentation.SqlClient" Version="1.14.0-beta.1" />
</ItemGroup>
<!-- Rebus-->
<ItemGroup>
<PackageVersion Include="Rebus.Microsoft.Extensions.Logging" Version="5.2.0" />
<PackageVersion Include="Rebus.ServiceProvider" Version="10.7.1" />
</ItemGroup>
<!-- Test -->
<ItemGroup>
<PackageVersion Include="coverlet.collector" Version="6.0.4" />
<PackageVersion Include="Microsoft.NET.Test.Sdk" Version="17.14.1" />
<PackageVersion Include="Moq.AutoMock" Version="3.5.0" />
<PackageVersion Include="NSubstitute" Version="5.3.0" />
<PackageVersion Include="Shouldly" Version="4.3.0" />
<PackageVersion Include="xunit" Version="2.9.3" />
<PackageVersion Include="xunit.extensibility.execution" Version="2.9.3" />
<PackageVersion Include="xunit.runner.visualstudio" Version="3.1.4" />
</ItemGroup>
<!-- Fody -->
<ItemGroup>
<PackageVersion Include="ConfigureAwait.Fody" Version="3.3.2" />
<PackageVersion Include="Fody" Version="6.9.3" />
</ItemGroup>
<!-- DataBase -->
<ItemGroup>
<PackageVersion Include="MySqlConnector" Version="2.4.0" />
<PackageVersion Include="Oracle.ManagedDataAccess.Core" Version="23.6.1" />
<PackageVersion Include="Npgsql" Version="10.0.0" />
<PackageVersion Include="Microsoft.Data.SqlClient" Version="6.1.1" />
<PackageVersion Include="Microsoft.Data.Sqlite.Core" Version="10.0.0" />
</ItemGroup>
<!-- Other -->
<ItemGroup>
<PackageVersion Include="AspNet.Security.OAuth.Bilibili" Version="10.0.0" />
<PackageVersion Include="AspNet.Security.OAuth.GitHub" Version="10.0.0" />
<PackageVersion Include="AspNet.Security.OAuth.QQ" Version="10.0.0" />
<PackageVersion Include="AspNet.Security.OAuth.Weixin" Version="10.0.0" />
<PackageVersion Include="AspNet.Security.OAuth.WorkWeixin" Version="10.0.0" />
<PackageVersion Include="Microsoft.AspNetCore.Authentication.Google" Version="$(MicrosoftAspNetCorePackageVersion)" />
<PackageVersion Include="Microsoft.AspNetCore.Authentication.MicrosoftAccount" Version="$(MicrosoftAspNetCorePackageVersion)" />
<PackageVersion Include="Microsoft.AspNetCore.Authentication.Twitter" Version="$(MicrosoftAspNetCorePackageVersion)" />
<PackageVersion Include="Microsoft.IdentityModel.Tokens" Version="8.14.0" />
<PackageVersion Include="aliyun-net-sdk-core" Version="1.6.2" />
<PackageVersion Include="Aliyun.OSS.SDK.NetCore" Version="2.14.1" />
<PackageVersion Include="AgileConfig.Client" Version="1.8.0" />
<PackageVersion Include="CommonMark.NET" Version="0.15.1" />
<PackageVersion Include="Elastic.Apm.NetCoreAll" Version="1.34.1" />
<PackageVersion Include="BouncyCastle.Cryptography" Version="2.6.2" />
<PackageVersion Include="Dapr.Client" Version="1.16.0" />
<PackageVersion Include="Dapr.Actors" Version="1.16.0" />
<PackageVersion Include="Dapr.Actors.AspNetCore" Version="1.16.0" />
<PackageVersion Include="DistributedLock.Core" Version="1.0.8" />
<PackageVersion Include="DistributedLock.Redis" Version="1.1.0" />
<PackageVersion Include="Hangfire.MySqlStorage" Version="2.0.3" />
<PackageVersion Include="HangFire.SqlServer" Version="1.8.21" />
<PackageVersion Include="IdentityModel" Version="7.0.0" />
<PackageVersion Include="IP2Region.Net" Version="3.0.0" />
<PackageVersion Include="JetBrains.Annotations" Version="2025.2.2" />
<PackageVersion Include="Magicodes.IE.Excel" Version="2.8.2" />
<PackageVersion Include="Markdig" Version="0.44.0" />
<PackageVersion Include="MiniExcel" Version="1.42.0" />
<PackageVersion Include="Newtonsoft.Json" Version="13.0.4" />
<PackageVersion Include="NEST" Version="7.17.5" />
<PackageVersion Include="Elastic.Clients.Elasticsearch" Version="8.19.4" />
<PackageVersion Include="NRules" Version="0.9.2" />
<PackageVersion Include="Ocelot.Provider.Polly" Version="20.0.0" />
<PackageVersion Include="OpenIddict.Server.DataProtection" Version="7.2.0" />
<PackageVersion Include="OpenIddict.Validation.DataProtection" Version="7.2.0" />
<PackageVersion Include="Polly" Version="8.6.3" />
<PackageVersion Include="QRCoder" Version="1.5.1" />
<PackageVersion Include="Quartz.Serialization.Json" Version="3.15.0" />
<PackageVersion Include="Rebus.RabbitMq" Version="10.0.1" />
<PackageVersion Include="RulesEngine" Version="5.0.5" />
<PackageVersion Include="Scriban" Version="6.3.0" />
<PackageVersion Include="Senparc.Weixin.MP" Version="16.18.9" />
<PackageVersion Include="SkyApm.Agent.Hosting" Version="2.2.0" />
<PackageVersion Include="SkyApm.Diagnostics.AspNetCore" Version="2.2.0" />
<PackageVersion Include="SkyAPM.Diagnostics.CAP" Version="2.2.0" />
<PackageVersion Include="SixLabors.ImageSharp" Version="3.1.11" />
<PackageVersion Include="SixLabors.ImageSharp.Drawing" Version="2.1.7" />
<PackageVersion Include="StackExchange.Redis" Version="2.9.17" />
<PackageVersion Include="Spire.XLS" Version="15.12.0" />
<PackageVersion Include="Swashbuckle.AspNetCore" Version="9.0.4" />
<PackageVersion Include="System.ComponentModel.Annotations" Version="5.0.0" />
<PackageVersion Include="Tencent.QCloud.Cos.Sdk" Version="5.4.37" />
<PackageVersion Include="TencentCloudSDK" Version="3.0.1273" />
<PackageVersion Include="Yarp.ReverseProxy" Version="2.3.0" />
<PackageVersion Include="Yarp.Telemetry.Consumption" Version="2.3.0" />
</ItemGroup>
</Project>

3
apps/vben5/apps/app-antd/src/locales/langs/en-US/abp.json

@ -18,7 +18,8 @@
"invalidUserNameOrPassword": "Invalid username or password!",
"tokenHasExpired": "The token is no longer valid!",
"requiresTwoFactor": "Identity verification is required. Please select a verification method!",
"shouldChangePassword": "Your password has expired. Please change it and login!"
"shouldChangePassword": "Your password has expired. Please change it and login!",
"accessDenied": "You have refused the necessary authorization for the application. Please log in again!"
}
},
"manage": {

3
apps/vben5/apps/app-antd/src/locales/langs/zh-CN/abp.json

@ -18,7 +18,8 @@
"invalidUserNameOrPassword": "用户名或密码错误!",
"tokenHasExpired": "您的请求会话已过期,请重新登录!",
"requiresTwoFactor": "需要验证身份,请选择一种验证方式!",
"shouldChangePassword": "您的密码已过期,请修改密码后登录!"
"shouldChangePassword": "您的密码已过期,请修改密码后登录!",
"accessDenied": "您拒绝了应用程序必须的授权, 请重新登录!"
}
},
"manage": {

2
apps/vben5/apps/app-antd/src/router/routes/core.ts

@ -28,7 +28,7 @@ const coreRoutes: RouteRecordRaw[] = [
hideInBreadcrumb: true,
hideInMenu: true,
hideInTab: true,
title: 'Processing login',
title: $t('page.auth.processingLogin'),
},
name: 'OidcFallback',
path: '/signin-callback',

6
apps/vben5/apps/app-antd/src/store/auth.ts

@ -1,4 +1,4 @@
import type { TokenResult } from '@abp/account';
import type { OAuthError, TokenResult } from '@abp/account';
import type { Recordable, UserInfo } from '@vben/types';
@ -45,7 +45,7 @@ export const useAuthStore = defineStore('auth', () => {
await oAuthService.login();
}
async function oidcCallback() {
async function oidcCallback(onError?: (error: OAuthError) => void) {
try {
const user = await oAuthService.handleCallback();
return await _loginSuccess({
@ -55,6 +55,8 @@ export const useAuthStore = defineStore('auth', () => {
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
expiresIn: user.expires_in!,
});
} catch (error: any) {
onError && onError(error as OAuthError);
} finally {
loginLoading.value = false;
}

16
apps/vben5/apps/app-antd/src/views/_core/fallback/login-callback.vue

@ -1,12 +1,26 @@
<script lang="ts" setup>
import { onMounted } from 'vue';
import { useOAuthError } from '@abp/account';
import { Modal } from 'ant-design-vue';
import { useAuthStore } from '#/store/auth';
const { formatError } = useOAuthError();
const authStore = useAuthStore();
onMounted(async () => {
await authStore.oidcCallback();
await authStore.oidcCallback((error) => {
Modal.warn({
centered: true,
maskClosable: false,
closable: false,
title: formatError(error),
onOk: () => {
authStore.logout();
},
});
});
});
</script>

12
apps/vben5/packages/@abp/account/src/hooks/useOAuthError.ts

@ -1,10 +1,6 @@
import { $t } from '@vben/locales';
import type { OAuthError } from '../types/token';
interface OAuthError {
error: string;
error_description?: string;
error_uri?: string;
}
import { $t } from '@vben/locales';
export function useOAuthError() {
function formatError(error: OAuthError) {
@ -22,6 +18,10 @@ export function useOAuthError() {
case 'RequiresTwoFactor': {
return $t('abp.oauth.errors.requiresTwoFactor');
}
// 用户拒绝授权
case 'The authorization was denied by the end user.': {
return $t('abp.oauth.errors.accessDenied');
}
// Token已失效
case 'The token is no longer valid.':
case 'The user is no longer allowed to sign in.': {

1
apps/vben5/packages/@abp/account/src/utils/auth.ts

@ -157,6 +157,7 @@ const oidcSettings: UserManagerSettings = {
silent_redirect_uri: `${window.location.origin}/silent-renew.html`,
automaticSilentRenew: true,
loadUserInfo: true,
prompt: 'select_account',
userStore: new WebStorageStateStore({
store: import.meta.env.DEV
? localStorage

1
apps/vben5/packages/@abp/openiddict/src/components/applications/ApplicationModal.vue

@ -125,6 +125,7 @@ const endpoints = reactive<DefaultOptionType[]>([
{ label: 'device', value: 'device' },
{ label: 'revocation', value: 'revocation' },
{ label: 'introspection', value: 'introspection' },
{ label: 'pushed_authorization', value: 'pushed_authorization' },
]);
const getGrantTypes = computed(() => {
const types = openIdConfiguration.value?.grant_types_supported ?? [];

50
apps/vben5/packages/@abp/openiddict/src/components/scopes/ScopeModal.vue

@ -1,20 +1,17 @@
<script setup lang="ts">
import type { OpenIdConfiguration } from '@abp/core';
import type { FormInstance } from 'ant-design-vue';
import type { TransferItem } from 'ant-design-vue/es/transfer';
import type { OpenIddictScopeDto } from '../../types/scopes';
import type { DisplayNameInfo } from '../display-names/types';
import type { PropertyInfo } from '../properties/types';
import { computed, defineEmits, defineOptions, ref, toValue } from 'vue';
import { defineEmits, defineOptions, ref, toValue } from 'vue';
import { useVbenModal } from '@vben/common-ui';
import { $t } from '@vben/locales';
import { Form, Input, message, Tabs, Transfer } from 'ant-design-vue';
import { Form, Input, message, Select, Tabs } from 'ant-design-vue';
import { useOpenIdApi } from '../../api/useOpenIdApi';
import { useScopesApi } from '../../api/useScopesApi';
import DisplayNameTable from '../display-names/DisplayNameTable.vue';
import PropertyTable from '../properties/PropertyTable.vue';
@ -41,20 +38,8 @@ const defaultModel = {} as OpenIddictScopeDto;
const form = ref<FormInstance>();
const formModel = ref<OpenIddictScopeDto>({ ...defaultModel });
const openIdConfiguration = ref<OpenIdConfiguration>();
const activeTab = ref<TabKeys>('basic');
const getSupportClaims = computed((): TransferItem[] => {
const types = openIdConfiguration.value?.claims_supported ?? [];
return types.map((type) => {
return {
key: type,
title: type,
};
});
});
const { discoveryApi } = useOpenIdApi();
const { cancel, createApi, getApi, updateApi } = useScopesApi();
const [Modal, modalApi] = useVbenModal({
class: 'w-1/2',
@ -91,7 +76,6 @@ const [Modal, modalApi] = useVbenModal({
});
try {
modalApi.setState({ loading: true });
await onDiscovery();
const { id } = modalApi.getData<OpenIddictScopeDto>();
id && (await onGet(id));
} finally {
@ -108,9 +92,6 @@ async function onGet(id: string) {
title: `${$t('AbpOpenIddict.Scopes')} - ${dto.name}`,
});
}
async function onDiscovery() {
openIdConfiguration.value = await discoveryApi();
}
function onDescriptionChange(displayName: DisplayNameInfo) {
formModel.value.descriptions ??= {};
formModel.value.descriptions[displayName.culture] = displayName.displayName;
@ -155,6 +136,16 @@ function onPropDelete(prop: PropertyInfo) {
>
<Input v-model:value="formModel.name" autocomplete="off" />
</FormItem>
<FormItem
:label="$t('AbpOpenIddict.DisplayName:Resources')"
name="resources"
>
<Select
allow-clear
v-model:value="formModel.resources"
mode="tags"
/>
</FormItem>
</TabPane>
<!-- 显示名称 -->
<TabPane key="dispalyName" :tab="$t('AbpOpenIddict.DisplayNames')">
@ -184,23 +175,6 @@ function onPropDelete(prop: PropertyInfo) {
@delete="onDescriptionDelete"
/>
</TabPane>
<!-- 资源 -->
<TabPane key="resource" :tab="$t('AbpOpenIddict.Resources')">
<Transfer
v-model:target-keys="formModel.resources"
:data-source="getSupportClaims"
:list-style="{
width: '47%',
height: '338px',
}"
:render="(item) => item.title"
:titles="[
$t('AbpOpenIddict.Assigned'),
$t('AbpOpenIddict.Available'),
]"
class="tree-transfer"
/>
</TabPane>
<!-- 属性 -->
<TabPane key="props" :tab="$t('AbpOpenIddict.Propertites')">
<PropertyTable

2
apps/vben5/packages/@abp/saas/src/components/tenants/TenantModal.vue

@ -148,7 +148,7 @@ async function onGet() {
async function onSubmit() {
try {
modalApi.setState({ submitting: true });
if (!tenant.value.useSharedDatabase) {
if (!tenant.value.id && !tenant.value.useSharedDatabase) {
await checkConnectionString({
connectionString: tenant.value.defaultConnectionString,
provider: tenant.value.provider,

11
aspnet-core/LINGYUN.MicroService.SingleProject.sln

@ -1,6 +1,6 @@
Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 18
VisualStudioVersion = 18.0.11205.157
# Visual Studio Version 17
VisualStudioVersion = 17.14.36616.10 d17.14
MinimumVisualStudioVersion = 10.0.40219.1
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "modules", "modules", "{0B58AA48-665A-443F-A6A8-751FB9629DAF}"
EndProject
@ -496,8 +496,6 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.AspNetCore.Mvc.
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.AspNetCore.Wrapper", "framework\common\LINGYUN.Abp.AspNetCore.Wrapper\LINGYUN.Abp.AspNetCore.Wrapper.csproj", "{FDBA1B4A-CC5D-4710-AB8C-FA5A91B91BDE}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.OpenIddict.AspNetCore", "modules\openIddict\LINGYUN.Abp.OpenIddict.AspNetCore\LINGYUN.Abp.OpenIddict.AspNetCore.csproj", "{6026DAE3-F2AD-4F6B-99EF-EEAAA5873861}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.WeChat.Official.Application.Contracts", "framework\wechat\LINGYUN.Abp.WeChat.Official.Application.Contracts\LINGYUN.Abp.WeChat.Official.Application.Contracts.csproj", "{B7F866FF-8C8F-4C7D-9084-E0C206F1F26F}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.WeChat.Official.Application", "framework\wechat\LINGYUN.Abp.WeChat.Official.Application\LINGYUN.Abp.WeChat.Official.Application.csproj", "{E957DB2E-589D-4310-9576-92F108A67CE7}"
@ -1488,10 +1486,6 @@ Global
{FDBA1B4A-CC5D-4710-AB8C-FA5A91B91BDE}.Debug|Any CPU.Build.0 = Debug|Any CPU
{FDBA1B4A-CC5D-4710-AB8C-FA5A91B91BDE}.Release|Any CPU.ActiveCfg = Release|Any CPU
{FDBA1B4A-CC5D-4710-AB8C-FA5A91B91BDE}.Release|Any CPU.Build.0 = Release|Any CPU
{6026DAE3-F2AD-4F6B-99EF-EEAAA5873861}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{6026DAE3-F2AD-4F6B-99EF-EEAAA5873861}.Debug|Any CPU.Build.0 = Debug|Any CPU
{6026DAE3-F2AD-4F6B-99EF-EEAAA5873861}.Release|Any CPU.ActiveCfg = Release|Any CPU
{6026DAE3-F2AD-4F6B-99EF-EEAAA5873861}.Release|Any CPU.Build.0 = Release|Any CPU
{B7F866FF-8C8F-4C7D-9084-E0C206F1F26F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{B7F866FF-8C8F-4C7D-9084-E0C206F1F26F}.Debug|Any CPU.Build.0 = Debug|Any CPU
{B7F866FF-8C8F-4C7D-9084-E0C206F1F26F}.Release|Any CPU.ActiveCfg = Release|Any CPU
@ -2111,7 +2105,6 @@ Global
{3690518A-D6C3-42CC-AEC2-6D48C6987F68} = {5531E2F2-2FC2-45A0-93C7-7FC6F6A4F0AD}
{0D34162C-0CE3-4D7B-B19A-4786C616D0B3} = {5531E2F2-2FC2-45A0-93C7-7FC6F6A4F0AD}
{FDBA1B4A-CC5D-4710-AB8C-FA5A91B91BDE} = {40A9F0DB-66AA-42A8-8670-9DD6DA992103}
{6026DAE3-F2AD-4F6B-99EF-EEAAA5873861} = {7C714185-D3D9-4D94-B5CB-D857A0091F04}
{B7F866FF-8C8F-4C7D-9084-E0C206F1F26F} = {91867618-0D86-4410-91C6-B1166A9ACDF9}
{E957DB2E-589D-4310-9576-92F108A67CE7} = {91867618-0D86-4410-91C6-B1166A9ACDF9}
{4DEFD1AB-C8CD-4240-B4C7-1C8EA4286B2A} = {91867618-0D86-4410-91C6-B1166A9ACDF9}

2
aspnet-core/aspire/LINGYUN.Abp.MicroService.AdminService.DbMigrator/LINGYUN.Abp.MicroService.AdminService.DbMigrator.csproj

@ -4,7 +4,7 @@
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net9.0</TargetFramework>
<TargetFramework>net10.0</TargetFramework>
<Nullable>enable</Nullable>
<IsPackable>false</IsPackable>
<RootNamespace>LINGYUN.Abp.MicroService.AdminService</RootNamespace>

59
aspnet-core/aspire/LINGYUN.Abp.MicroService.AdminService.EntityFrameworkCore/AdminServiceDataSeeder.cs

@ -0,0 +1,59 @@
using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Logging.Abstractions;
using System.Linq;
using System.Threading.Tasks;
using Volo.Abp.Authorization.Permissions;
using Volo.Abp.Data;
using Volo.Abp.DependencyInjection;
using Volo.Abp.MultiTenancy;
using Volo.Abp.PermissionManagement;
namespace LINGYUN.Abp.MicroService.AdminService;
public class AdminServiceDataSeeder : ITransientDependency
{
protected ILogger<AdminServiceDataSeeder> Logger { get; }
protected ICurrentTenant CurrentTenant { get; }
protected IPermissionDefinitionManager PermissionDefinitionManager { get; }
protected IPermissionDataSeeder PermissionDataSeeder { get; }
public AdminServiceDataSeeder(
IPermissionDefinitionManager permissionDefinitionManager,
IPermissionDataSeeder permissionDataSeeder,
ICurrentTenant currentTenant)
{
PermissionDefinitionManager = permissionDefinitionManager;
PermissionDataSeeder = permissionDataSeeder;
CurrentTenant = currentTenant;
Logger = NullLogger<AdminServiceDataSeeder>.Instance;
}
public virtual async Task SeedAsync(DataSeedContext context)
{
using (CurrentTenant.Change(context.TenantId))
{
await SeedAdminRolePermissionsAsync(context);
}
}
private async Task SeedAdminRolePermissionsAsync(DataSeedContext context)
{
Logger.LogInformation("Seeding the default role permissions...");
var multiTenancySide = CurrentTenant.GetMultiTenancySide();
var permissionNames = (await PermissionDefinitionManager.GetPermissionsAsync())
.Where(p => p.MultiTenancySide.HasFlag(multiTenancySide))
.Where(p => !p.Providers.Any() || p.Providers.Contains(RolePermissionValueProvider.ProviderName))
.Select(p => p.Name)
.ToArray();
await PermissionDataSeeder.SeedAsync(
RolePermissionValueProvider.ProviderName,
"admin",
permissionNames,
context?.TenantId
);
Logger.LogInformation("Seed default role permissions completed.");
}
}

19
aspnet-core/aspire/LINGYUN.Abp.MicroService.AdminService.EntityFrameworkCore/AdminServiceDbMigrationEventHandler.cs

@ -1,5 +1,4 @@
using Microsoft.Extensions.Logging;
using System;
using System.Threading.Tasks;
using Volo.Abp.Data;
using Volo.Abp.DistributedLocking;
@ -11,7 +10,7 @@ using Volo.Abp.Uow;
namespace LINGYUN.Abp.MicroService.AdminService;
public class AdminServiceDbMigrationEventHandler : EfCoreDatabaseMigrationEventHandlerBase<AdminServiceMigrationsDbContext>
{
protected IDataSeeder DataSeeder { get; }
protected AdminServiceDataSeeder DataSeeder { get; }
public AdminServiceDbMigrationEventHandler(
ICurrentTenant currentTenant,
@ -20,7 +19,7 @@ public class AdminServiceDbMigrationEventHandler : EfCoreDatabaseMigrationEventH
IAbpDistributedLock abpDistributedLock,
IDistributedEventBus distributedEventBus,
ILoggerFactory loggerFactory,
IDataSeeder dataSeeder)
AdminServiceDataSeeder dataSeeder)
: base(
ConnectionStringNameAttribute.GetConnStringName<AdminServiceMigrationsDbContext>(),
currentTenant, unitOfWorkManager, tenantStore, abpDistributedLock, distributedEventBus, loggerFactory)
@ -28,8 +27,18 @@ public class AdminServiceDbMigrationEventHandler : EfCoreDatabaseMigrationEventH
DataSeeder = dataSeeder;
}
protected async override Task SeedAsync(Guid? tenantId)
protected async override Task AfterTenantCreated(TenantCreatedEto eventData, bool schemaMigrated)
{
await DataSeeder.SeedAsync(tenantId);
// 新租户数据种子
var context = new DataSeedContext(eventData.Id);
if (eventData.Properties != null)
{
foreach (var property in eventData.Properties)
{
context.WithProperty(property.Key, property.Value);
}
}
await DataSeeder.SeedAsync(context);
}
}

12
aspnet-core/aspire/LINGYUN.Abp.MicroService.AdminService.EntityFrameworkCore/AdminServiceDbMigrationService.cs

@ -1,6 +1,7 @@
using LINGYUN.Abp.Data.DbMigrator;
using Microsoft.Extensions.Logging;
using System;
using System.Threading.Tasks;
using Volo.Abp.Data;
using Volo.Abp.DependencyInjection;
using Volo.Abp.DistributedLocking;
@ -11,16 +12,25 @@ using Volo.Abp.Uow;
namespace LINGYUN.Abp.MicroService.AdminService;
public class AdminServiceDbMigrationService : EfCoreRuntimeDbMigratorBase<AdminServiceMigrationsDbContext>, ITransientDependency
{
protected AdminServiceDataSeeder DataSeeder { get; }
public AdminServiceDbMigrationService(
ICurrentTenant currentTenant,
IUnitOfWorkManager unitOfWorkManager,
IServiceProvider serviceProvider,
IAbpDistributedLock abpDistributedLock,
IDistributedEventBus distributedEventBus,
ILoggerFactory loggerFactory)
ILoggerFactory loggerFactory,
AdminServiceDataSeeder dataSeeder)
: base(
ConnectionStringNameAttribute.GetConnStringName<AdminServiceMigrationsDbContext>(),
unitOfWorkManager, serviceProvider, currentTenant, abpDistributedLock, distributedEventBus, loggerFactory)
{
DataSeeder = dataSeeder;
}
protected async override Task SeedAsync()
{
// DbMigrator迁移数据种子
await DataSeeder.SeedAsync(new DataSeedContext());
}
}

2
aspnet-core/aspire/LINGYUN.Abp.MicroService.AdminService.EntityFrameworkCore/LINGYUN.Abp.MicroService.AdminService.EntityFrameworkCore.csproj

@ -5,7 +5,7 @@
<PropertyGroup>
<IsPackable>false</IsPackable>
<TargetFramework>net9.0</TargetFramework>
<TargetFramework>net10.0</TargetFramework>
<Nullable>enable</Nullable>
<RootNamespace>LINGYUN.Abp.MicroService.AdminService</RootNamespace>
</PropertyGroup>

13
aspnet-core/aspire/LINGYUN.Abp.MicroService.AdminService/AdminServiceModule.cs

@ -36,13 +36,11 @@ using Volo.Abp.AspNetCore.Mvc.UI.MultiTenancy;
using Volo.Abp.AspNetCore.Serilog;
using Volo.Abp.Autofac;
using Volo.Abp.Caching.StackExchangeRedis;
using Volo.Abp.Data;
using Volo.Abp.Http.Client;
using Volo.Abp.Modularity;
using Volo.Abp.PermissionManagement.Identity;
using Volo.Abp.PermissionManagement.OpenIddict;
using Volo.Abp.Swashbuckle;
using Volo.Abp.Threading;
namespace LINGYUN.Abp.MicroService.AdminService;
@ -143,15 +141,4 @@ public partial class AdminServiceModule : AbpModule
ConfigureDistributedLocking(context.Services, configuration);
ConfigureSecurity(context.Services, configuration, hostingEnvironment.IsDevelopment());
}
public override void OnApplicationInitialization(ApplicationInitializationContext context)
{
AsyncHelper.RunSync(() => OnApplicationInitializationAsync(context));
}
public async override Task OnApplicationInitializationAsync(ApplicationInitializationContext context)
{
await context.ServiceProvider
.GetRequiredService<IDataSeeder>()
.SeedAsync();
}
}

2
aspnet-core/aspire/LINGYUN.Abp.MicroService.AdminService/LINGYUN.Abp.MicroService.AdminService.csproj

@ -1,7 +1,7 @@
<Project Sdk="Microsoft.NET.Sdk.Web">
<PropertyGroup>
<TargetFramework>net9.0</TargetFramework>
<TargetFramework>net10.0</TargetFramework>
<Nullable>enable</Nullable>
<ImplicitUsings>enable</ImplicitUsings>
<RootNamespace>LINGYUN.Abp.MicroService.AdminService</RootNamespace>

3
aspnet-core/aspire/LINGYUN.Abp.MicroService.AdminService/appsettings.Development.json

@ -51,7 +51,8 @@
},
"AuthServer": {
"Authority": "http://localhost:44385/",
"Audience": "lingyun-abp-application",
"Audience": "admin-service",
"ValidAudiences": [ "lingyun-abp-application" ],
"MapInboundClaims": false,
"RequireHttpsMetadata": false,
"SwaggerClientId": "vue-oauth-client"

10
aspnet-core/aspire/LINGYUN.Abp.MicroService.ApiGateway/ApiGatewayModule.cs

@ -64,15 +64,7 @@ public class ApiGatewayModule : AbpModule
authority: configuration["AuthServer:Authority"],
scopes: new Dictionary<string, string>
{
{"Account", "Account API"},
{"Identity", "Identity API"},
{"IdentityServer", "Identity Server API"},
{"BackendAdmin", "Backend Admin API"},
{"Localization", "Localization API"},
{"Platform", "Platform API"},
{"RealtimeMessage", "RealtimeMessage API"},
{"TaskManagement", "Task Management API"},
{"Webhooks", "Webhooks API"},
{ configuration["AuthServer:Audience"], "Api Gateway API"}
},
options =>
{

2
aspnet-core/aspire/LINGYUN.Abp.MicroService.ApiGateway/LINGYUN.Abp.MicroService.ApiGateway.csproj

@ -2,7 +2,7 @@
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net9.0</TargetFramework>
<TargetFramework>net10.0</TargetFramework>
<RootNamespace>LINGYUN.Abp.MicroService.ApiGateway</RootNamespace>
</PropertyGroup>

2
aspnet-core/aspire/LINGYUN.Abp.MicroService.ApiGateway/Program.cs

@ -103,7 +103,7 @@ try
clusterGroup.Value.Metadata.TryGetValue("SwaggerEndpoint", out var address) &&
!address.IsNullOrWhiteSpace())
{
options.SwaggerEndpoint($"{address}/swagger/v1/swagger.json", $"{routeConfig.RouteId} API");
options.SwaggerEndpoint($"{address}/swagger/v1/swagger.json", $"{routeConfig.ClusterId} API");
}
options.OAuthClientId(configuration["AuthServer:SwaggerClientId"]);
options.OAuthClientSecret(configuration["AuthServer:SwaggerClientSecret"]);

6
aspnet-core/aspire/LINGYUN.Abp.MicroService.ApiGateway/appsettings.Development.json

@ -16,9 +16,11 @@
},
"AuthServer": {
"Authority": "http://localhost:44385/",
"Audience": "lingyun-abp-application",
"Audience": "api-gateway",
"ValidAudiences": [ "lingyun-abp-application" ],
"MapInboundClaims": false,
"RequireHttpsMetadata": false
"RequireHttpsMetadata": false,
"SwaggerClientId": "vue-oauth-client"
},
"Logging": {
"Serilog": {

95
aspnet-core/aspire/LINGYUN.Abp.MicroService.ApiGateway/yarp.json

@ -2,7 +2,7 @@
"ReverseProxy": {
"Routes": {
"abp-route": {
"ClusterId": "admin-api-cluster",
"ClusterId": "admin-service-cluster",
"Match": {
"Path": "/api/abp/{**everything}"
},
@ -23,7 +23,7 @@
}
]
},
"auth-wellknown-route": {
"oidc-discovery-route": {
"ClusterId": "auth-server-cluster",
"Match": {
"Path": "/.well-known/{**everything}"
@ -38,7 +38,7 @@
}
]
},
"auth-server-route": {
"oidc-token-route": {
"ClusterId": "auth-server-cluster",
"Match": {
"Path": "/connect/{**everything}"
@ -53,7 +53,7 @@
}
]
},
"external-logins-route": {
"account-external-logins-route": {
"ClusterId": "auth-server-cluster",
"Match": {
"Path": "/api/account/external-logins/{**everything}"
@ -68,7 +68,7 @@
}
]
},
"oauth-route": {
"account-oauth-route": {
"ClusterId": "auth-server-cluster",
"Match": {
"Path": "/api/account/oauth/{**everything}"
@ -83,7 +83,7 @@
}
]
},
"qrcode-route": {
"account-qrcode-route": {
"ClusterId": "auth-server-cluster",
"Match": {
"Path": "/api/account/qrcode/{**everything}"
@ -99,7 +99,7 @@
]
},
"account-route": {
"ClusterId": "auth-server-api-cluster",
"ClusterId": "identity-service-cluster",
"Match": {
"Path": "/api/account/{**everything}"
},
@ -114,7 +114,7 @@
]
},
"identity-route": {
"ClusterId": "auth-server-api-cluster",
"ClusterId": "identity-service-cluster",
"Match": {
"Path": "/api/identity/{**everything}"
},
@ -129,7 +129,7 @@
]
},
"identity-server-route": {
"ClusterId": "auth-server-api-cluster",
"ClusterId": "identity-service-cluster",
"Match": {
"Path": "/api/identity-server/{**everything}"
},
@ -144,7 +144,7 @@
]
},
"openiddict-route": {
"ClusterId": "auth-server-api-cluster",
"ClusterId": "identity-service-cluster",
"Match": {
"Path": "/api/openiddict/{**everything}"
},
@ -159,7 +159,7 @@
]
},
"cache-management-route": {
"ClusterId": "admin-api-cluster",
"ClusterId": "admin-service-cluster",
"Match": {
"Path": "/api/caching-management/{**everything}"
},
@ -174,7 +174,7 @@
]
},
"saas-route": {
"ClusterId": "admin-api-cluster",
"ClusterId": "admin-service-cluster",
"Match": {
"Path": "/api/saas/{**everything}"
},
@ -189,7 +189,7 @@
]
},
"auditing-route": {
"ClusterId": "admin-api-cluster",
"ClusterId": "admin-service-cluster",
"Match": {
"Path": "/api/auditing/{**everything}"
},
@ -204,7 +204,7 @@
]
},
"data-protected-route": {
"ClusterId": "admin-api-cluster",
"ClusterId": "admin-service-cluster",
"Match": {
"Path": "/api/data-protection-management/{**everything}"
},
@ -219,7 +219,7 @@
]
},
"text-template-route": {
"ClusterId": "admin-api-cluster",
"ClusterId": "admin-service-cluster",
"Match": {
"Path": "/api/text-templating/{**everything}"
},
@ -234,7 +234,7 @@
]
},
"feature-management-route": {
"ClusterId": "admin-api-cluster",
"ClusterId": "admin-service-cluster",
"Match": {
"Path": "/api/feature-management/{**everything}"
},
@ -249,7 +249,7 @@
]
},
"permission-management-route": {
"ClusterId": "admin-api-cluster",
"ClusterId": "admin-service-cluster",
"Match": {
"Path": "/api/permission-management/{**everything}"
},
@ -264,7 +264,7 @@
]
},
"setting-management-route": {
"ClusterId": "admin-api-cluster",
"ClusterId": "admin-service-cluster",
"Match": {
"Path": "/api/setting-management/{**everything}"
},
@ -279,7 +279,7 @@
]
},
"localization-management-route": {
"ClusterId": "localization-api-cluster",
"ClusterId": "localization-service-cluster",
"Match": {
"Path": "/api/localization/{**everything}"
},
@ -294,7 +294,7 @@
]
},
"im-route": {
"ClusterId": "messages-api-cluster",
"ClusterId": "messages-service-cluster",
"Match": {
"Path": "/api/im/{**everything}"
},
@ -309,7 +309,7 @@
]
},
"notifications-route": {
"ClusterId": "messages-api-cluster",
"ClusterId": "messages-service-cluster",
"Match": {
"Path": "/api/notifications/{**everything}"
},
@ -323,8 +323,8 @@
}
]
},
"signalr-route": {
"ClusterId": "messages-api-cluster",
"signalr-hubs-route": {
"ClusterId": "messages-service-cluster",
"Match": {
"Path": "/signalr-hubs/{**everything}"
},
@ -344,8 +344,8 @@
}
]
},
"webhooks-management-route": {
"ClusterId": "webhooks-api-cluster",
"webhooks-route": {
"ClusterId": "webhooks-service-cluster",
"Match": {
"Path": "/api/webhooks/{**everything}"
},
@ -360,7 +360,7 @@
]
},
"task-management-route": {
"ClusterId": "tasks-api-cluster",
"ClusterId": "task-service-cluster",
"Match": {
"Path": "/api/task-management/{**everything}"
},
@ -375,7 +375,7 @@
]
},
"platform-route": {
"ClusterId": "platform-api-cluster",
"ClusterId": "platform-service-cluster",
"Match": {
"Path": "/api/platform/{**everything}"
},
@ -389,8 +389,8 @@
}
]
},
"oss-route": {
"ClusterId": "platform-api-cluster",
"oss-management-route": {
"ClusterId": "platform-service-cluster",
"Match": {
"Path": "/api/oss-management/{**everything}"
},
@ -405,7 +405,7 @@
]
},
"files-route": {
"ClusterId": "platform-api-cluster",
"ClusterId": "platform-service-cluster",
"Match": {
"Path": "/api/files/{**everything}"
},
@ -420,7 +420,7 @@
]
},
"wechat-route": {
"ClusterId": "wechat-api-cluster",
"ClusterId": "wechat-service-cluster",
"Match": {
"Path": "/api/wechat/{**everything}"
},
@ -433,6 +433,21 @@
"ResponseHeadersAllowed": "_AbpWrapResult;_AbpDontWrapResult;_AbpErrorFormat"
}
]
},
"elsa-route": {
"ClusterId": "workflow-service-cluster",
"Match": {
"Path": "/elsa/{**everything}"
},
"Transforms": [
{
"HeaderPrefix": "X-Forwarded-",
"X-Forwarded": "Append"
},
{
"ResponseHeadersAllowed": "_AbpWrapResult;_AbpDontWrapResult;_AbpErrorFormat"
}
]
}
},
"Clusters": {
@ -443,7 +458,7 @@
}
}
},
"auth-server-api-cluster": {
"identity-service-cluster": {
"Destinations": {
"destination1": {
"Address": "http://localhost:30015",
@ -453,7 +468,7 @@
}
}
},
"admin-api-cluster": {
"admin-service-cluster": {
"Destinations": {
"destination1": {
"Address": "http://localhost:30010",
@ -463,7 +478,7 @@
}
}
},
"localization-api-cluster": {
"localization-service-cluster": {
"Destinations": {
"destination1": {
"Address": "http://localhost:30030",
@ -473,7 +488,7 @@
}
}
},
"messages-api-cluster": {
"messages-service-cluster": {
"Destinations": {
"destination1": {
"Address": "http://localhost:30020",
@ -483,7 +498,7 @@
}
}
},
"webhooks-api-cluster": {
"webhooks-service-cluster": {
"Destinations": {
"destination1": {
"Address": "http://localhost:30045",
@ -493,7 +508,7 @@
}
}
},
"tasks-api-cluster": {
"task-service-cluster": {
"Destinations": {
"destination1": {
"Address": "http://localhost:30040",
@ -503,7 +518,7 @@
}
}
},
"platform-api-cluster": {
"platform-service-cluster": {
"Destinations": {
"destination1": {
"Address": "http://localhost:30025",
@ -513,7 +528,7 @@
}
}
},
"workflow-api-cluster": {
"workflow-service-cluster": {
"Destinations": {
"destination1": {
"Address": "http://localhost:30050",
@ -523,7 +538,7 @@
}
}
},
"wechat-api-cluster": {
"wechat-service-cluster": {
"Destinations": {
"destination1": {
"Address": "http://localhost:30060",

2
aspnet-core/aspire/LINGYUN.Abp.MicroService.AppHost/LINGYUN.Abp.MicroService.AppHost.csproj

@ -2,7 +2,7 @@
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net9.0</TargetFramework>
<TargetFramework>net10.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
<UserSecretsId>13c67981-84b2-4284-81fc-61ede65252c3</UserSecretsId>

2
aspnet-core/aspire/LINGYUN.Abp.MicroService.AuthServer.DbMigrator/LINGYUN.Abp.MicroService.AuthServer.DbMigrator.csproj

@ -4,7 +4,7 @@
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net9.0</TargetFramework>
<TargetFramework>net10.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
<IsPackable>false</IsPackable>

29
aspnet-core/aspire/LINGYUN.Abp.MicroService.AuthServer.DbMigrator/appsettings.json

@ -1,5 +1,34 @@
{
"ConnectionStrings": {
"Default": "Host=127.0.0.1;Database=abp;Username=postgres;Password=123456"
},
"OpenIddict": {
"Applications": {
"VueAdmin": {
"ClientId": "vue-admin-client",
"ClientSecret": "1q2w3e*",
"RootUrls": [ "http://localhost:5666" ]
},
"InternalService": {
"ClientId": "InternalServiceClient",
"ClientSecret": "1q2w3e*"
},
"VueOAuthClient": {
"ClientId": "vue-oauth-client",
"RootUrls": [
"http://localhost:5666",
"http://localhost:30000",
"http://localhost:30010",
"http://localhost:30015",
"http://localhost:30020",
"http://localhost:30025",
"http://localhost:30030",
"http://localhost:30040",
"http://localhost:30045",
"http://localhost:30050",
"http://localhost:30060"
]
}
}
}
}

35
aspnet-core/aspire/LINGYUN.Abp.MicroService.AuthServer.EntityFrameworkCore/AuthServerDataSeeder.cs

@ -0,0 +1,35 @@
using LINGYUN.Abp.MicroService.AuthServer.DataSeeds;
using System.Threading.Tasks;
using Volo.Abp.Data;
using Volo.Abp.DependencyInjection;
using Volo.Abp.MultiTenancy;
namespace LINGYUN.Abp.MicroService.AuthServer;
public class AuthServerDataSeeder : ITransientDependency
{
protected ICurrentTenant CurrentTenant { get; }
protected OpenIddictDataSeeder OpenIddictDataSeeder { get; }
protected IdentityClaimTypeDataSeeder IdentityClaimTypeDataSeeder { get; }
protected IdentityUserRoleDataSeeder IdentityUserRoleDataSeeder { get; }
public AuthServerDataSeeder(
ICurrentTenant currentTenant,
OpenIddictDataSeeder openIddictDataSeeder,
IdentityClaimTypeDataSeeder identityClaimTypeDataSeeder,
IdentityUserRoleDataSeeder identityUserRoleDataSeeder)
{
CurrentTenant = currentTenant;
OpenIddictDataSeeder = openIddictDataSeeder;
IdentityClaimTypeDataSeeder = identityClaimTypeDataSeeder;
IdentityUserRoleDataSeeder = identityUserRoleDataSeeder;
}
public virtual async Task SeedAsync(DataSeedContext context)
{
using (CurrentTenant.Change(context.TenantId))
{
await OpenIddictDataSeeder.SeedAsync(context);
await IdentityClaimTypeDataSeeder.SeedAsync(context);
await IdentityUserRoleDataSeeder.SeedAsync(context);
}
}
}

109
aspnet-core/aspire/LINGYUN.Abp.MicroService.AuthServer.EntityFrameworkCore/AuthServerDbMigrationEventHandler.cs

@ -1,28 +1,17 @@
using Microsoft.AspNetCore.Identity;
using Microsoft.Extensions.Logging;
using System;
using System.Collections.Generic;
using Microsoft.Extensions.Logging;
using System.Threading.Tasks;
using Volo.Abp.Authorization.Permissions;
using Volo.Abp.Data;
using Volo.Abp.DistributedLocking;
using Volo.Abp.EntityFrameworkCore.Migrations;
using Volo.Abp.EventBus.Distributed;
using Volo.Abp.Guids;
using Volo.Abp.Identity;
using Volo.Abp.MultiTenancy;
using Volo.Abp.PermissionManagement;
using Volo.Abp.Uow;
using IdentityPermissions = Volo.Abp.Identity.IdentityPermissions;
namespace LINGYUN.Abp.MicroService.AuthServer;
public class AuthServerDbMigrationEventHandler : EfCoreDatabaseMigrationEventHandlerBase<AuthServerMigrationsDbContext>
{
protected IGuidGenerator GuidGenerator { get; }
protected IdentityUserManager IdentityUserManager { get; }
protected IdentityRoleManager IdentityRoleManager { get; }
protected IPermissionDataSeeder PermissionDataSeeder { get; }
protected AuthServerDataSeeder DataSeeder { get; }
public AuthServerDbMigrationEventHandler(
ICurrentTenant currentTenant,
@ -31,102 +20,26 @@ public class AuthServerDbMigrationEventHandler : EfCoreDatabaseMigrationEventHan
IAbpDistributedLock abpDistributedLock,
IDistributedEventBus distributedEventBus,
ILoggerFactory loggerFactory,
IGuidGenerator guidGenerator,
IdentityUserManager identityUserManager,
IdentityRoleManager identityRoleManager,
IPermissionDataSeeder permissionDataSeeder)
AuthServerDataSeeder dataSeeder)
: base(
ConnectionStringNameAttribute.GetConnStringName<AuthServerMigrationsDbContext>(),
currentTenant, unitOfWorkManager, tenantStore, abpDistributedLock, distributedEventBus, loggerFactory)
{
GuidGenerator = guidGenerator;
IdentityUserManager = identityUserManager;
IdentityRoleManager = identityRoleManager;
PermissionDataSeeder = permissionDataSeeder;
DataSeeder = dataSeeder;
}
protected async override Task AfterTenantCreated(TenantCreatedEto eventData, bool schemaMigrated)
{
if (!schemaMigrated)
// 新租户数据种子
var context = new DataSeedContext(eventData.Id);
if (eventData.Properties != null)
{
return;
}
using (CurrentTenant.Change(eventData.Id))
{
await SeedTenantDefaultRoleAsync(eventData);
await SeedTenantAdminAsync(eventData);
}
}
protected async virtual Task SeedTenantDefaultRoleAsync(TenantCreatedEto eventData)
{
// 默认用户
var roleId = GuidGenerator.Create();
var defaultRole = new IdentityRole(roleId, "Users", eventData.Id)
{
IsStatic = true,
IsPublic = true,
IsDefault = true,
};
(await IdentityRoleManager.CreateAsync(defaultRole)).CheckErrors();
// 所有用户都应该具有查询用户权限, 用于IM场景
await PermissionDataSeeder.SeedAsync(
RolePermissionValueProvider.ProviderName,
defaultRole.Name,
new string[]
foreach (var property in eventData.Properties )
{
IdentityPermissions.UserLookup.Default,
IdentityPermissions.Users.Default
},
tenantId: eventData.Id);
}
protected async virtual Task SeedTenantAdminAsync(TenantCreatedEto eventData)
{
const string tenantAdminUserName = "admin";
const string tenantAdminRoleName = "admin";
Guid tenantAdminRoleId;
if (!await IdentityRoleManager.RoleExistsAsync(tenantAdminRoleName))
{
tenantAdminRoleId = GuidGenerator.Create();
var tenantAdminRole = new IdentityRole(tenantAdminRoleId, tenantAdminRoleName, eventData.Id)
{
IsStatic = true,
IsPublic = true
};
(await IdentityRoleManager.CreateAsync(tenantAdminRole)).CheckErrors();
}
else
{
var tenantAdminRole = await IdentityRoleManager.FindByNameAsync(tenantAdminRoleName);
tenantAdminRoleId = tenantAdminRole.Id;
context.WithProperty(property.Key, property.Value);
}
}
var adminUserId = GuidGenerator.Create();
if (eventData.Properties.TryGetValue("AdminUserId", out var userIdString) &&
Guid.TryParse(userIdString, out var adminUserGuid))
{
adminUserId = adminUserGuid;
}
var adminEmailAddress = eventData.Properties.GetOrDefault("AdminEmail") ?? "admin@abp.io";
var adminPassword = eventData.Properties.GetOrDefault("AdminPassword") ?? "1q2w3E*";
var tenantAdminUser = await IdentityUserManager.FindByNameAsync(adminEmailAddress);
if (tenantAdminUser == null)
{
tenantAdminUser = new IdentityUser(
adminUserId,
tenantAdminUserName,
adminEmailAddress,
eventData.Id);
tenantAdminUser.AddRole(tenantAdminRoleId);
// 创建租户管理用户
(await IdentityUserManager.CreateAsync(tenantAdminUser)).CheckErrors();
(await IdentityUserManager.AddPasswordAsync(tenantAdminUser, adminPassword)).CheckErrors();
}
await DataSeeder.SeedAsync(context);
}
}

13
aspnet-core/aspire/LINGYUN.Abp.MicroService.AuthServer.EntityFrameworkCore/AuthServerDbMigrationService.cs

@ -2,6 +2,7 @@
using LINGYUN.Abp.Saas.Tenants;
using Microsoft.Extensions.Logging;
using System;
using System.Threading.Tasks;
using Volo.Abp.Data;
using Volo.Abp.DependencyInjection;
using Volo.Abp.DistributedLocking;
@ -13,8 +14,8 @@ namespace LINGYUN.Abp.MicroService.AuthServer;
public class AuthServerDbMigrationService : EfCoreRuntimeDbMigratorBase<AuthServerMigrationsDbContext>, ITransientDependency
{
protected AuthServerDataSeeder DataSeeder { get; }
public AuthServerDbMigrationService(
IDataSeeder dataSeeder,
IDbSchemaMigrator dbSchemaMigrator,
ITenantRepository tenantRepository,
ICurrentTenant currentTenant,
@ -22,10 +23,18 @@ public class AuthServerDbMigrationService : EfCoreRuntimeDbMigratorBase<AuthServ
IServiceProvider serviceProvider,
IAbpDistributedLock abpDistributedLock,
IDistributedEventBus distributedEventBus,
ILoggerFactory loggerFactory)
ILoggerFactory loggerFactory,
AuthServerDataSeeder dataSeeder)
: base(
ConnectionStringNameAttribute.GetConnStringName<AuthServerMigrationsDbContext>(),
unitOfWorkManager, serviceProvider, currentTenant, abpDistributedLock, distributedEventBus, loggerFactory)
{
DataSeeder = dataSeeder;
}
protected async override Task SeedAsync()
{
// DbMigrator迁移数据种子
await DataSeeder.SeedAsync(new DataSeedContext());
}
}

89
aspnet-core/aspire/LINGYUN.Abp.MicroService.AuthServer.EntityFrameworkCore/DataSeeds/IdentityClaimTypeDataSeeder.cs

@ -0,0 +1,89 @@
using JetBrains.Annotations;
using Microsoft.Extensions.Logging;
using OpenIddict.Abstractions;
using System.Threading.Tasks;
using Volo.Abp.Data;
using Volo.Abp.DependencyInjection;
using Volo.Abp.Guids;
using Volo.Abp.Identity;
namespace LINGYUN.Abp.MicroService.AuthServer.DataSeeds;
public class IdentityClaimTypeDataSeeder : ITransientDependency
{
public ILogger<IdentityClaimTypeDataSeeder> Logger { protected get; set; }
protected IGuidGenerator GuidGenerator { get; }
protected IdentityClaimTypeManager IdentityClaimTypeManager { get; }
protected IIdentityClaimTypeRepository IdentityClaimTypeRepository { get; }
public IdentityClaimTypeDataSeeder(
IGuidGenerator guidGenerator,
IdentityClaimTypeManager identityClaimTypeManager,
IIdentityClaimTypeRepository identityClaimTypeRepository)
{
GuidGenerator = guidGenerator;
IdentityClaimTypeManager = identityClaimTypeManager;
IdentityClaimTypeRepository = identityClaimTypeRepository;
}
public async virtual Task SeedAsync(DataSeedContext context)
{
if (context.TenantId.HasValue)
{
return;
}
Logger.LogInformation("Seeding the default identity claim types...");
await CreateIdentityClaimTypeAsync(OpenIddictConstants.Claims.Address);
await CreateIdentityClaimTypeAsync(OpenIddictConstants.Claims.Birthdate, valueType: IdentityClaimValueType.DateTime);
await CreateIdentityClaimTypeAsync(OpenIddictConstants.Claims.Country);
await CreateIdentityClaimTypeAsync(OpenIddictConstants.Claims.Email);
await CreateIdentityClaimTypeAsync(OpenIddictConstants.Claims.EmailVerified, valueType: IdentityClaimValueType.Boolean);
await CreateIdentityClaimTypeAsync(OpenIddictConstants.Claims.FamilyName);
await CreateIdentityClaimTypeAsync(OpenIddictConstants.Claims.Gender);
await CreateIdentityClaimTypeAsync(OpenIddictConstants.Claims.GivenName);
await CreateIdentityClaimTypeAsync(OpenIddictConstants.Claims.Locale);
await CreateIdentityClaimTypeAsync(OpenIddictConstants.Claims.Locality);
await CreateIdentityClaimTypeAsync(OpenIddictConstants.Claims.MiddleName);
await CreateIdentityClaimTypeAsync(OpenIddictConstants.Claims.Name);
await CreateIdentityClaimTypeAsync(OpenIddictConstants.Claims.Nickname);
await CreateIdentityClaimTypeAsync(OpenIddictConstants.Claims.PhoneNumber);
await CreateIdentityClaimTypeAsync(OpenIddictConstants.Claims.PhoneNumberVerified, valueType: IdentityClaimValueType.Boolean);
await CreateIdentityClaimTypeAsync(OpenIddictConstants.Claims.Picture);
await CreateIdentityClaimTypeAsync(OpenIddictConstants.Claims.PostalCode);
await CreateIdentityClaimTypeAsync(OpenIddictConstants.Claims.PreferredUsername);
await CreateIdentityClaimTypeAsync(OpenIddictConstants.Claims.Profile);
await CreateIdentityClaimTypeAsync(OpenIddictConstants.Claims.Region);
await CreateIdentityClaimTypeAsync(OpenIddictConstants.Claims.Role);
await CreateIdentityClaimTypeAsync(OpenIddictConstants.Claims.StreetAddress);
await CreateIdentityClaimTypeAsync(OpenIddictConstants.Claims.Username);
await CreateIdentityClaimTypeAsync(OpenIddictConstants.Claims.Website);
await CreateIdentityClaimTypeAsync(OpenIddictConstants.Claims.Zoneinfo);
Logger.LogInformation("Seeding default identity claim types completed.");
}
private async Task CreateIdentityClaimTypeAsync(
[NotNull] string name,
bool required = false,
bool isStatic = false,
[CanBeNull] string regex = null,
[CanBeNull] string regexDescription = null,
[CanBeNull] string description = null,
IdentityClaimValueType valueType = IdentityClaimValueType.String)
{
if (!await IdentityClaimTypeRepository.AnyAsync(name))
{
await IdentityClaimTypeManager.CreateAsync(
new IdentityClaimType(
GuidGenerator.Create(),
name,
required,
isStatic,
regex,
regexDescription,
description,
valueType));
}
}
}

124
aspnet-core/aspire/LINGYUN.Abp.MicroService.AuthServer.EntityFrameworkCore/DataSeeds/IdentityUserRoleDataSeeder.cs

@ -0,0 +1,124 @@
using Microsoft.AspNetCore.Identity;
using Microsoft.Extensions.Options;
using System;
using System.Threading.Tasks;
using Volo.Abp.Data;
using Volo.Abp.DependencyInjection;
using Volo.Abp.Guids;
using Volo.Abp.Identity;
namespace LINGYUN.Abp.MicroService.AuthServer.DataSeeds;
public class IdentityUserRoleDataSeeder : ITransientDependency
{
public const string AdminUserIdPropertyName = "AdminUserId";
public const string AdminEmailPropertyName = "AdminEmail";
public const string AdminEmailDefaultValue = "admin@abp.io";
public const string AdminUserNamePropertyName = "AdminUserName";
public const string AdminUserNameDefaultValue = "admin";
public const string AdminPasswordPropertyName = "AdminPassword";
public const string AdminPasswordDefaultValue = "1q2w3E*";
protected IGuidGenerator GuidGenerator { get; }
protected IIdentityRoleRepository RoleRepository { get; }
protected IIdentityUserRepository UserRepository { get; }
protected ILookupNormalizer LookupNormalizer { get; }
protected IdentityUserManager UserManager { get; }
protected IdentityRoleManager RoleManager { get; }
protected IOptions<IdentityOptions> IdentityOptions { get; }
public IdentityUserRoleDataSeeder(
IGuidGenerator guidGenerator,
IIdentityRoleRepository roleRepository,
IIdentityUserRepository userRepository,
ILookupNormalizer lookupNormalizer,
IdentityUserManager userManager,
IdentityRoleManager roleManager,
IOptions<IdentityOptions> identityOptions)
{
GuidGenerator = guidGenerator;
RoleRepository = roleRepository;
UserRepository = userRepository;
LookupNormalizer = lookupNormalizer;
UserManager = userManager;
RoleManager = roleManager;
IdentityOptions = identityOptions;
}
public virtual async Task SeedAsync(DataSeedContext context)
{
await SeedAdminUserAsync(context);
await SeedDefaultRoleAsync(context);
}
private async Task SeedAdminUserAsync(DataSeedContext context)
{
await IdentityOptions.SetAsync();
const string adminRoleName = "admin";
var adminUserName = context?[AdminUserNamePropertyName] as string ?? AdminUserNameDefaultValue;
Guid adminRoleId;
if (!await RoleManager.RoleExistsAsync(adminRoleName))
{
adminRoleId = GuidGenerator.Create();
var adminRole = new IdentityRole(
adminRoleId,
adminRoleName,
context.TenantId)
{
IsStatic = true,
IsPublic = true
};
(await RoleManager.CreateAsync(adminRole)).CheckErrors();
}
else
{
var adminRole = await RoleManager.FindByNameAsync(adminRoleName);
adminRoleId = adminRole.Id;
}
var adminUserId = GuidGenerator.Create();
if (context.Properties.TryGetValue(AdminUserIdPropertyName, out var userIdString) &&
Guid.TryParse(userIdString?.ToString(), out var adminUserGuid))
{
adminUserId = adminUserGuid;
}
var adminEmailAddress = context?[AdminEmailPropertyName] as string ?? AdminEmailDefaultValue;
var adminPassword = context?[AdminPasswordPropertyName] as string ?? AdminPasswordDefaultValue;
var adminUser = await UserManager.FindByNameAsync(adminUserName);
if (adminUser == null)
{
adminUser = new IdentityUser(
adminUserId,
adminUserName,
adminEmailAddress,
context.TenantId);
adminUser.AddRole(adminRoleId);
// 创建租户管理用户
(await UserManager.CreateAsync(adminUser)).CheckErrors();
(await UserManager.AddPasswordAsync(adminUser, adminPassword)).CheckErrors();
}
}
private async Task SeedDefaultRoleAsync(DataSeedContext context)
{
const string defaultRoleName = "Users";
if (await RoleManager.FindByNameAsync(defaultRoleName) != null)
{
var roleId = GuidGenerator.Create();
var defaultRole = new IdentityRole(
roleId,
defaultRoleName,
context.TenantId)
{
IsStatic = true,
IsPublic = true,
IsDefault = true,
};
(await RoleManager.CreateAsync(defaultRole)).CheckErrors();
}
}
}

551
aspnet-core/aspire/LINGYUN.Abp.MicroService.AuthServer.EntityFrameworkCore/DataSeeds/OpenIddictDataSeeder.cs

@ -0,0 +1,551 @@
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Logging.Abstractions;
using OpenIddict.Abstractions;
using System;
using System.Collections.Generic;
using System.Globalization;
using System.Threading.Tasks;
using Volo.Abp.Authorization.Permissions;
using Volo.Abp.Data;
using Volo.Abp.DependencyInjection;
using Volo.Abp.OpenIddict;
using Volo.Abp.OpenIddict.Applications;
using Volo.Abp.OpenIddict.Scopes;
using Volo.Abp.PermissionManagement;
namespace LINGYUN.Abp.MicroService.AuthServer.DataSeeds;
public class OpenIddictDataSeeder : OpenIddictDataSeedContributorBase, ITransientDependency
{
public ILogger<OpenIddictDataSeeder> Logger { protected get; set; }
protected IPermissionDataSeeder PermissionDataSeeder { get; }
public OpenIddictDataSeeder(
IConfiguration configuration,
IOpenIddictApplicationRepository openIddictApplicationRepository,
IAbpApplicationManager applicationManager,
IOpenIddictScopeRepository openIddictScopeRepository,
IOpenIddictScopeManager scopeManager,
IPermissionDataSeeder permissionDataSeeder)
: base(configuration, openIddictApplicationRepository, applicationManager, openIddictScopeRepository, scopeManager)
{
PermissionDataSeeder = permissionDataSeeder;
Logger = NullLogger<OpenIddictDataSeeder>.Instance;
}
public async virtual Task SeedAsync(DataSeedContext context)
{
if (context.TenantId.HasValue)
{
return;
}
var scope = "lingyun-abp-application";
Logger.LogInformation("Seeding the default scope...");
await CreateDefaultScopeAsync();
await CreateApiScopeAsync(scope);
Logger.LogInformation("Seeding the default applications...");
await CreateApplicationAsync(scope);
Logger.LogInformation("Seeding default applications completed.");
}
private async Task CreateDefaultScopeAsync()
{
// OpenId Connect
await CreateScopesAsync(new OpenIddictScopeDescriptor
{
Name = OpenIddictConstants.Scopes.OpenId,
DisplayName = "OpenId Connect",
DisplayNames =
{
[CultureInfo.GetCultureInfo("zh-Hans")] = "身份认证",
[CultureInfo.GetCultureInfo("en")] = "OpenId Connect"
},
Description = "OpenId Connect协议进行身份验证",
Descriptions =
{
[CultureInfo.GetCultureInfo("zh-Hans")] = "允许应用程序使用您的身份信息进行登录",
[CultureInfo.GetCultureInfo("en")] = "Allow the application to authenticate you using OpenID Connect"
}
});
// Profile
await CreateScopesAsync(new OpenIddictScopeDescriptor
{
Name = OpenIddictConstants.Scopes.Profile,
DisplayName = "个人资料",
DisplayNames =
{
[CultureInfo.GetCultureInfo("zh-Hans")] = "个人资料",
[CultureInfo.GetCultureInfo("en")] = "Profile"
},
Description = "访问您的基本个人资料信息",
Descriptions =
{
[CultureInfo.GetCultureInfo("zh-Hans")] = "允许应用程序访问您的姓名、头像等基本信息",
[CultureInfo.GetCultureInfo("en")] = "Allow the application to access your basic profile information like name and picture"
}
});
// Email
await CreateScopesAsync(new OpenIddictScopeDescriptor
{
Name = OpenIddictConstants.Scopes.Email,
DisplayName = "电子邮件",
DisplayNames =
{
[CultureInfo.GetCultureInfo("zh-Hans")] = "电子邮件",
[CultureInfo.GetCultureInfo("en")] = "Email"
},
Description = "访问您的电子邮件地址",
Descriptions =
{
[CultureInfo.GetCultureInfo("zh-Hans")] = "允许应用程序访问您的电子邮件地址",
[CultureInfo.GetCultureInfo("en")] = "Allow the application to access your email address"
}
});
// Phone
await CreateScopesAsync(new OpenIddictScopeDescriptor
{
Name = OpenIddictConstants.Scopes.Phone,
DisplayName = "电话号码",
DisplayNames =
{
[CultureInfo.GetCultureInfo("zh-Hans")] = "电话号码",
[CultureInfo.GetCultureInfo("en")] = "Phone"
},
Description = "访问您的电话号码",
Descriptions =
{
[CultureInfo.GetCultureInfo("zh-Hans")] = "允许应用程序访问您的电话号码",
[CultureInfo.GetCultureInfo("en")] = "Allow the application to access your phone number"
}
});
// Address
await CreateScopesAsync(new OpenIddictScopeDescriptor
{
Name = OpenIddictConstants.Scopes.Address,
DisplayName = "地址信息",
DisplayNames =
{
[CultureInfo.GetCultureInfo("zh-Hans")] = "地址信息",
[CultureInfo.GetCultureInfo("en")] = "Address"
},
Description = "访问您的地址信息",
Descriptions =
{
[CultureInfo.GetCultureInfo("zh-Hans")] = "允许应用程序访问您的地址信息",
[CultureInfo.GetCultureInfo("en")] = "Allow the application to access your address information"
}
});
// Roles
await CreateScopesAsync(new OpenIddictScopeDescriptor
{
Name = OpenIddictConstants.Scopes.Roles,
DisplayName = "角色信息",
DisplayNames =
{
[CultureInfo.GetCultureInfo("zh-Hans")] = "角色信息",
[CultureInfo.GetCultureInfo("en")] = "Roles"
},
Description = "访问您的角色信息",
Descriptions =
{
[CultureInfo.GetCultureInfo("zh-Hans")] = "允许应用程序访问您的角色和权限信息",
[CultureInfo.GetCultureInfo("en")] = "Allow the application to access your roles and permissions"
}
});
// OfflineAccess
await CreateScopesAsync(new OpenIddictScopeDescriptor
{
Name = OpenIddictConstants.Scopes.OfflineAccess,
DisplayName = "离线访问",
DisplayNames =
{
[CultureInfo.GetCultureInfo("zh-Hans")] = "离线访问",
[CultureInfo.GetCultureInfo("en")] = "Offline Access"
},
Description = "在您未登录时访问您的信息",
Descriptions =
{
[CultureInfo.GetCultureInfo("zh-Hans")] = "允许应用程序在您未登录时访问您的信息",
[CultureInfo.GetCultureInfo("en")] = "Allow the application to access your information while you are offline"
}
});
}
private async Task CreateApiScopeAsync(string scope)
{
// 前端汇总授权范围
await CreateScopesAsync(new OpenIddictScopeDescriptor
{
Name = scope,
DisplayName = "微服务访问授权",
DisplayNames =
{
[CultureInfo.GetCultureInfo("zh-Hans")] = "微服务访问授权",
[CultureInfo.GetCultureInfo("en")] = "Single Applications"
},
Description = "适用于微服务体系的接口授权",
Descriptions =
{
[CultureInfo.GetCultureInfo("zh-Hans")] = "允许应用程序使用各微服务模块的接口",
[CultureInfo.GetCultureInfo("en")] = "Allow the application to use the interfaces of each microservice module"
},
Resources =
{
"api-gateway",
"auth-server",
"admin-service",
"identity-service",
"localization-service",
"message-service",
"platform-service",
"task-service",
"webhook-service",
"wechat-service",
"workflow-service",
}
});
// ApiGateway Swagger
await CreateScopesAsync(new OpenIddictScopeDescriptor
{
Name = "api-gateway",
DisplayName = "Api Gateway",
DisplayNames =
{
[CultureInfo.GetCultureInfo("zh-Hans")] = "应用程序接口网关",
[CultureInfo.GetCultureInfo("en")] = "Api Gateway"
},
Description = "适用于应用程序接口网关Swagger授权",
Descriptions =
{
[CultureInfo.GetCultureInfo("zh-Hans")] = "适用于应用程序接口网关Swagger授权",
[CultureInfo.GetCultureInfo("en")] = "Applicable to application Programming interface gateway Swagger authorization"
},
Resources =
{
"api-gateway",
}
});
// Admin Service
await CreateScopesAsync(new OpenIddictScopeDescriptor
{
Name = "admin-service",
DisplayName = "Admin Service",
DisplayNames =
{
[CultureInfo.GetCultureInfo("zh-Hans")] = "后台管理服务",
[CultureInfo.GetCultureInfo("en")] = "Admin Service"
},
Description = "适用于后台管理服务Swagger授权",
Descriptions =
{
[CultureInfo.GetCultureInfo("zh-Hans")] = "适用于后台管理服务Swagger授权",
[CultureInfo.GetCultureInfo("en")] = "Applicable to the back-end management service Swagger authorization"
},
Resources =
{
"admin-service",
}
});
// Identity Service
await CreateScopesAsync(new OpenIddictScopeDescriptor
{
Name = "identity-service",
DisplayName = "Identity Service",
DisplayNames =
{
[CultureInfo.GetCultureInfo("zh-Hans")] = "身份认证服务",
[CultureInfo.GetCultureInfo("en")] = "Identity Service"
},
Description = "适用于身份认证服务Swagger授权",
Descriptions =
{
[CultureInfo.GetCultureInfo("zh-Hans")] = "适用于身份认证服务Swagger授权",
[CultureInfo.GetCultureInfo("en")] = "Applicable to the identity service Swagger authorization"
},
Resources =
{
"identity-service",
}
});
// Localization Service
await CreateScopesAsync(new OpenIddictScopeDescriptor
{
Name = "localization-service",
DisplayName = "Localization Service",
DisplayNames =
{
[CultureInfo.GetCultureInfo("zh-Hans")] = "本地化管理服务",
[CultureInfo.GetCultureInfo("en")] = "Localization Service"
},
Description = "适用于本地化管理服务Swagger授权",
Descriptions =
{
[CultureInfo.GetCultureInfo("zh-Hans")] = "适用于本地化管理服务Swagger授权",
[CultureInfo.GetCultureInfo("en")] = "Applicable to the Localization service Swagger authorization"
},
Resources =
{
"localization-service",
}
});
// Message Service
await CreateScopesAsync(new OpenIddictScopeDescriptor
{
Name = "message-service",
DisplayName = "Message Service",
DisplayNames =
{
[CultureInfo.GetCultureInfo("zh-Hans")] = "消息管理服务",
[CultureInfo.GetCultureInfo("en")] = "Message Service"
},
Description = "适用于消息管理服务Swagger授权",
Descriptions =
{
[CultureInfo.GetCultureInfo("zh-Hans")] = "适用于消息管理服务Swagger授权",
[CultureInfo.GetCultureInfo("en")] = "Applicable to the Message service Swagger authorization"
},
Resources =
{
"message-service",
}
});
// Platform Service
await CreateScopesAsync(new OpenIddictScopeDescriptor
{
Name = "platform-service",
DisplayName = "Platform Service",
DisplayNames =
{
[CultureInfo.GetCultureInfo("zh-Hans")] = "平台管理服务",
[CultureInfo.GetCultureInfo("en")] = "Platform Service"
},
Description = "适用于平台管理服务Swagger授权",
Descriptions =
{
[CultureInfo.GetCultureInfo("zh-Hans")] = "适用于平台管理服务Swagger授权",
[CultureInfo.GetCultureInfo("en")] = "Applicable to the Platform service Swagger authorization"
},
Resources =
{
"platform-service",
}
});
// Task Service
await CreateScopesAsync(new OpenIddictScopeDescriptor
{
Name = "task-service",
DisplayName = "Task Service",
DisplayNames =
{
[CultureInfo.GetCultureInfo("zh-Hans")] = "任务管理服务",
[CultureInfo.GetCultureInfo("en")] = "Task Service"
},
Description = "适用于任务管理服务Swagger授权",
Descriptions =
{
[CultureInfo.GetCultureInfo("zh-Hans")] = "适用于任务管理服务Swagger授权",
[CultureInfo.GetCultureInfo("en")] = "Applicable to the Task service Swagger authorization"
},
Resources =
{
"task-service",
}
});
// Webhook Service
await CreateScopesAsync(new OpenIddictScopeDescriptor
{
Name = "webhook-service",
DisplayName = "Webhook Service",
DisplayNames =
{
[CultureInfo.GetCultureInfo("zh-Hans")] = "Webhook管理服务",
[CultureInfo.GetCultureInfo("en")] = "Webhook Service"
},
Description = "适用于Webhook管理服务Swagger授权",
Descriptions =
{
[CultureInfo.GetCultureInfo("zh-Hans")] = "适用于Webhook管理服务Swagger授权",
[CultureInfo.GetCultureInfo("en")] = "Applicable to the Webhook service Swagger authorization"
},
Resources =
{
"webhook-service",
}
});
// Wechat Service
await CreateScopesAsync(new OpenIddictScopeDescriptor
{
Name = "wechat-service",
DisplayName = "Wechat Service",
DisplayNames =
{
[CultureInfo.GetCultureInfo("zh-Hans")] = "微信管理服务",
[CultureInfo.GetCultureInfo("en")] = "Wechat Service"
},
Description = "适用于微信管理服务Swagger授权",
Descriptions =
{
[CultureInfo.GetCultureInfo("zh-Hans")] = "适用于微信管理服务Swagger授权",
[CultureInfo.GetCultureInfo("en")] = "Applicable to the Wechat service Swagger authorization"
},
Resources =
{
"wechat-service",
}
});
// Workflow Service
await CreateScopesAsync(new OpenIddictScopeDescriptor
{
Name = "workflow-service",
DisplayName = "Workflow Service",
DisplayNames =
{
[CultureInfo.GetCultureInfo("zh-Hans")] = "工作流管理服务",
[CultureInfo.GetCultureInfo("en")] = "Workflow Service"
},
Description = "适用于工作流管理服务Swagger授权",
Descriptions =
{
[CultureInfo.GetCultureInfo("zh-Hans")] = "适用于工作流管理服务Swagger授权",
[CultureInfo.GetCultureInfo("en")] = "Applicable to the Workflow service Swagger authorization"
},
Resources =
{
"workflow-service",
}
});
}
private async Task CreateApplicationAsync(string scope)
{
var configurationSection = Configuration.GetSection("OpenIddict:Applications");
var vueClientId = configurationSection["VueAdmin:ClientId"];
if (!vueClientId.IsNullOrWhiteSpace())
{
Logger.LogInformation("Seeding application {vueClientId}...", vueClientId);
var vueClientRootUrls = configurationSection.GetSection("VueAdmin:RootUrls").Get<List<string>>() ?? [];
var vueClientRedirectUrls = new List<string>();
var vueClientPostLogoutRedirectUrls = new List<string>();
vueClientRootUrls.ForEach(url =>
{
vueClientRedirectUrls.Add(url.EnsureEndsWith('/'));
vueClientRedirectUrls.Add(url.EnsureEndsWith('/') + "signin-callback");
vueClientPostLogoutRedirectUrls.Add(url.EnsureEndsWith('/'));
vueClientPostLogoutRedirectUrls.Add(url.EnsureEndsWith('/') + "signout-callback");
});
await CreateOrUpdateApplicationAsync(
OpenIddictConstants.ApplicationTypes.Web,
vueClientId,
OpenIddictConstants.ClientTypes.Confidential,
OpenIddictConstants.ConsentTypes.Explicit,
"Abp Vue Admin Client",
configurationSection["VueAdmin:ClientSecret"] ?? "1q2w3e*",
[OpenIddictConstants.GrantTypes.AuthorizationCode,
OpenIddictConstants.GrantTypes.Implicit,
OpenIddictConstants.GrantTypes.Password,
OpenIddictConstants.GrantTypes.RefreshToken],
[OpenIddictConstants.Scopes.OpenId,
OpenIddictConstants.Scopes.Email,
OpenIddictConstants.Scopes.Roles,
OpenIddictConstants.Scopes.Address,
OpenIddictConstants.Scopes.Phone,
OpenIddictConstants.Scopes.Profile,
OpenIddictConstants.Scopes.OfflineAccess,
scope],
vueClientRedirectUrls,
vueClientPostLogoutRedirectUrls);
var vueClientPermissions = new string[1]
{
"AbpIdentity.UserLookup"
};
await PermissionDataSeeder.SeedAsync(ClientPermissionValueProvider.ProviderName, vueClientId, vueClientPermissions);
}
var internalServiceClientId = configurationSection["InternalService:ClientId"];
if (!internalServiceClientId.IsNullOrWhiteSpace())
{
Logger.LogInformation("Seeding application {internalServiceClientId}...", internalServiceClientId);
await CreateOrUpdateApplicationAsync(
OpenIddictConstants.ApplicationTypes.Native,
internalServiceClientId,
OpenIddictConstants.ClientTypes.Confidential,
OpenIddictConstants.ConsentTypes.Explicit,
"Abp Internal Service Client",
configurationSection["InternalService:ClientSecret"] ?? "1q2w3e*",
[OpenIddictConstants.GrantTypes.ClientCredentials],
[OpenIddictConstants.ResponseTypes.Token, scope]);
}
var oauthClientId = configurationSection["VueOAuthClient:ClientId"];
if (!oauthClientId.IsNullOrWhiteSpace())
{
Logger.LogInformation("Seeding application {oauthClientId}...", oauthClientId);
var oauthClientRootUrls = configurationSection.GetSection("VueOAuthClient:RootUrls").Get<List<string>>() ?? [];
var oauthClientRedirectUrls = new List<string>();
var oauthClientPostLogoutRedirectUrls = new List<string>();
oauthClientRootUrls.ForEach(url =>
{
oauthClientRedirectUrls.Add(url.EnsureEndsWith('/'));
oauthClientRedirectUrls.Add(url.EnsureEndsWith('/') + "signin-callback");
oauthClientRedirectUrls.Add(url.EnsureEndsWith('/') + "swagger/oauth2-redirect.html");
oauthClientPostLogoutRedirectUrls.Add(url.EnsureEndsWith('/'));
oauthClientPostLogoutRedirectUrls.Add(url.EnsureEndsWith('/') + "signout-callback");
});
await CreateOrUpdateApplicationAsync(
OpenIddictConstants.ApplicationTypes.Web,
oauthClientId,
OpenIddictConstants.ClientTypes.Public,
OpenIddictConstants.ConsentTypes.Implicit,
"Abp OAuth Client",
null,
[OpenIddictConstants.GrantTypes.AuthorizationCode,
OpenIddictConstants.GrantTypes.RefreshToken],
[OpenIddictConstants.Scopes.OpenId,
OpenIddictConstants.Scopes.Email,
OpenIddictConstants.Scopes.Roles,
OpenIddictConstants.Scopes.Address,
OpenIddictConstants.Scopes.Phone,
OpenIddictConstants.Scopes.Profile,
OpenIddictConstants.Scopes.OfflineAccess,
scope,
"api-gateway",
"auth-server",
"admin-service",
"identity-service",
"localization-service",
"message-service",
"platform-service",
"task-service",
"webhook-service",
"wechat-service",
"workflow-service"],
oauthClientRedirectUrls,
oauthClientPostLogoutRedirectUrls);
var oauthClientPermissions = new string[1]
{
"AbpIdentity.UserLookup"
};
await PermissionDataSeeder.SeedAsync(ClientPermissionValueProvider.ProviderName, oauthClientId, oauthClientPermissions);
}
}
}

2
aspnet-core/aspire/LINGYUN.Abp.MicroService.AuthServer.EntityFrameworkCore/LINGYUN.Abp.MicroService.AuthServer.EntityFrameworkCore.csproj

@ -5,7 +5,7 @@
<PropertyGroup>
<IsPackable>false</IsPackable>
<TargetFramework>net9.0</TargetFramework>
<TargetFramework>net10.0</TargetFramework>
<RootNamespace>LINGYUN.Abp.MicroService.AuthServer</RootNamespace>
</PropertyGroup>

1251
aspnet-core/aspire/LINGYUN.Abp.MicroService.AuthServer.EntityFrameworkCore/Migrations/20260109050516_Upgrade-Abp-Framework-To-10-0-2.Designer.cs

File diff suppressed because it is too large

72
aspnet-core/aspire/LINGYUN.Abp.MicroService.AuthServer.EntityFrameworkCore/Migrations/20260109050516_Upgrade-Abp-Framework-To-10-0-2.cs

@ -0,0 +1,72 @@
using Microsoft.EntityFrameworkCore.Migrations;
#nullable disable
namespace LINGYUN.Abp.MicroService.AuthServer.Migrations
{
/// <inheritdoc />
public partial class UpgradeAbpFrameworkTo1002 : Migration
{
/// <inheritdoc />
protected override void Up(MigrationBuilder migrationBuilder)
{
migrationBuilder.AlterColumn<string>(
name: "Type",
table: "OpenIddictTokens",
type: "character varying(150)",
maxLength: 150,
nullable: true,
oldClrType: typeof(string),
oldType: "character varying(50)",
oldMaxLength: 50,
oldNullable: true);
migrationBuilder.AddColumn<string>(
name: "FrontChannelLogoutUri",
table: "OpenIddictApplications",
type: "text",
nullable: true);
migrationBuilder.AlterColumn<string>(
name: "DeviceInfo",
table: "AbpSessions",
type: "character varying(256)",
maxLength: 256,
nullable: true,
oldClrType: typeof(string),
oldType: "character varying(64)",
oldMaxLength: 64,
oldNullable: true);
}
/// <inheritdoc />
protected override void Down(MigrationBuilder migrationBuilder)
{
migrationBuilder.DropColumn(
name: "FrontChannelLogoutUri",
table: "OpenIddictApplications");
migrationBuilder.AlterColumn<string>(
name: "Type",
table: "OpenIddictTokens",
type: "character varying(50)",
maxLength: 50,
nullable: true,
oldClrType: typeof(string),
oldType: "character varying(150)",
oldMaxLength: 150,
oldNullable: true);
migrationBuilder.AlterColumn<string>(
name: "DeviceInfo",
table: "AbpSessions",
type: "character varying(64)",
maxLength: 64,
nullable: true,
oldClrType: typeof(string),
oldType: "character varying(256)",
oldMaxLength: 256,
oldNullable: true);
}
}
}

13
aspnet-core/aspire/LINGYUN.Abp.MicroService.AuthServer.EntityFrameworkCore/Migrations/AuthServerMigrationsDbContextModelSnapshot.cs

@ -19,7 +19,7 @@ namespace LINGYUN.Abp.MicroService.AuthServer.Migrations
#pragma warning disable 612, 618
modelBuilder
.HasAnnotation("_Abp_DatabaseProvider", EfCoreDatabaseProvider.PostgreSql)
.HasAnnotation("ProductVersion", "9.0.5")
.HasAnnotation("ProductVersion", "10.0.0")
.HasAnnotation("Relational:MaxIdentifierLength", 63);
NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder);
@ -337,8 +337,8 @@ namespace LINGYUN.Abp.MicroService.AuthServer.Migrations
.HasColumnType("character varying(64)");
b.Property<string>("DeviceInfo")
.HasMaxLength(64)
.HasColumnType("character varying(64)");
.HasMaxLength(256)
.HasColumnType("character varying(256)");
b.Property<string>("ExtraProperties")
.HasColumnType("text")
@ -863,6 +863,9 @@ namespace LINGYUN.Abp.MicroService.AuthServer.Migrations
.HasColumnType("text")
.HasColumnName("ExtraProperties");
b.Property<string>("FrontChannelLogoutUri")
.HasColumnType("text");
b.Property<bool>("IsDeleted")
.ValueGeneratedOnAdd()
.HasColumnType("boolean")
@ -1083,8 +1086,8 @@ namespace LINGYUN.Abp.MicroService.AuthServer.Migrations
.HasColumnType("character varying(400)");
b.Property<string>("Type")
.HasMaxLength(50)
.HasColumnType("character varying(50)");
.HasMaxLength(150)
.HasColumnType("character varying(150)");
b.HasKey("Id");

33
aspnet-core/aspire/LINGYUN.Abp.MicroService.AuthServer/AuthServerModule.Configure.cs

@ -1,5 +1,6 @@
using DotNetCore.CAP;
using LINGYUN.Abp.AspNetCore.MultiTenancy;
using LINGYUN.Abp.BlobStoring.OssManagement;
using LINGYUN.Abp.Localization.CultureMap;
using LINGYUN.Abp.LocalizationManagement;
using LINGYUN.Abp.MicroService.AuthServer.Ui.Branding;
@ -37,6 +38,9 @@ using System.Linq;
using System.Text.Encodings.Web;
using System.Text.Unicode;
using Volo.Abp.AspNetCore.Mvc;
using Volo.Abp.AspNetCore.Mvc.UI.Bundling;
using Volo.Abp.AspNetCore.Mvc.UI.Theme.LeptonXLite.Bundling;
using Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared.Bundling;
using Volo.Abp.Auditing;
using Volo.Abp.BlobStoring;
using Volo.Abp.Caching;
@ -160,12 +164,37 @@ public partial class AuthServerModule
}
}
private void ConfigureBlobStoring(IConfiguration configuration)
{
Configure<AbpBlobStoringOptions>(options =>
{
// all container use oss management
options.Containers.ConfigureAll((containerName, containerConfiguration) =>
{
// use oss management
containerConfiguration.UseOssManagement(config =>
{
config.Bucket = configuration[OssManagementBlobProviderConfigurationNames.Bucket];
});
});
});
}
private void ConfigureMvc(IServiceCollection services, IConfiguration configuration)
{
Configure<AbpAspNetCoreMvcOptions>(options =>
{
options.ExposeIntegrationServices = true;
});
Configure<AbpBundlingOptions>(options =>
{
options.StyleBundles
.Configure(LeptonXLiteThemeBundles.Styles.Global, bundle =>
{
bundle.AddFiles("/css/global-styles.css");
});
});
}
private void ConfigureDataSeeder()
@ -392,10 +421,6 @@ public partial class AuthServerModule
options.TokenValidationParameters.IssuerValidator = TokenWildcardIssuerValidator.IssuerValidator;
}
});
//.AddWeChatWork(options =>
//{
// options.SignInScheme = IdentityConstants.ExternalScheme;
//});
services
.AddDataProtection()

17
aspnet-core/aspire/LINGYUN.Abp.MicroService.AuthServer/AuthServerModule.cs

@ -25,19 +25,15 @@ using LINGYUN.Abp.OpenIddict.WeChat.Work;
using LINGYUN.Abp.Serilog.Enrichers.Application;
using LINGYUN.Abp.Serilog.Enrichers.UniqueId;
using LINGYUN.Abp.Sms.Platform;
using Microsoft.AspNetCore.Builder;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using System.Threading.Tasks;
using Volo.Abp;
using Volo.Abp.AspNetCore.Mvc.UI.Theme.LeptonXLite;
using Volo.Abp.AspNetCore.Serilog;
using Volo.Abp.Autofac;
using Volo.Abp.Caching.StackExchangeRedis;
using Volo.Abp.Data;
using Volo.Abp.Modularity;
using Volo.Abp.PermissionManagement.Identity;
using Volo.Abp.Threading;
namespace LINGYUN.Abp.MicroService.AuthServer;
@ -112,6 +108,7 @@ public partial class AuthServerModule : AbpModule
ConfigureTiming(configuration);
ConfigureAuditing(configuration);
ConfigureAuthServer(configuration);
ConfigureBlobStoring(configuration);
ConfigureMultiTenancy(configuration);
ConfigureJsonSerializer(configuration);
ConfigureMvc(context.Services, configuration);
@ -119,16 +116,4 @@ public partial class AuthServerModule : AbpModule
ConfigureDistributedLocking(context.Services, configuration);
ConfigureSecurity(context.Services, configuration, hostingEnvironment.IsDevelopment());
}
public override void OnApplicationInitialization(ApplicationInitializationContext context)
{
AsyncHelper.RunSync(() => OnApplicationInitializationAsync(context));
}
public async override Task OnApplicationInitializationAsync(ApplicationInitializationContext context)
{
await context.ServiceProvider
.GetRequiredService<IDataSeeder>()
.SeedAsync();
}
}

309
aspnet-core/aspire/LINGYUN.Abp.MicroService.AuthServer/DataSeeder/AuthServerDataSeedContributor.cs

@ -1,309 +0,0 @@
using Microsoft.Extensions.Configuration;
using OpenIddict.Abstractions;
using System;
using System.Collections.Generic;
using System.Globalization;
using System.Threading.Tasks;
using Volo.Abp.Authorization.Permissions;
using Volo.Abp.Data;
using Volo.Abp.DependencyInjection;
using Volo.Abp.MultiTenancy;
using Volo.Abp.OpenIddict.Applications;
using Volo.Abp.OpenIddict.Scopes;
using Volo.Abp.PermissionManagement;
namespace LINGYUN.Abp.MicroService.AuthServer.DataSeeder;
public class AuthServerDataSeedContributor : IDataSeedContributor, ITransientDependency
{
public static HashSet<string> InitializeScopes = new HashSet<string>
{
// obsolete! microservice should be allocated separately
"lingyun-abp-application",
// admin service
"ams",
// identity service
"ids",
// localization service
"lts",
// platform service
"pts",
// message service
"mgs",
// task service
"tks",
// webhook service
"wks",
// workflow service
"wfs",
// wechat service
"was"
};
private readonly IConfiguration _configuration;
private readonly ICurrentTenant _currentTenant;
private readonly IOpenIddictApplicationManager _applicationManager;
private readonly IOpenIddictApplicationRepository _applicationRepository;
private readonly IPermissionDataSeeder _permissionDataSeeder;
private readonly IOpenIddictScopeManager _scopeManager;
private readonly IOpenIddictScopeRepository _scopeRepository;
public AuthServerDataSeedContributor(
IConfiguration configuration,
ICurrentTenant currentTenant,
IOpenIddictScopeManager scopeManager,
IOpenIddictScopeRepository scopeRepository,
IPermissionDataSeeder permissionDataSeeder,
IOpenIddictApplicationManager applicationManager,
IOpenIddictApplicationRepository applicationRepository)
{
_configuration = configuration;
_currentTenant = currentTenant;
_scopeManager = scopeManager;
_scopeRepository = scopeRepository;
_permissionDataSeeder = permissionDataSeeder;
_applicationManager = applicationManager;
_applicationRepository = applicationRepository;
}
public async Task SeedAsync(DataSeedContext context)
{
using (_currentTenant.Change(context.TenantId))
{
await CreateScopeAsync(InitializeScopes);
await CreateApplicationAsync(InitializeScopes);
}
}
private async Task CreateScopeAsync(IEnumerable<string> scopes)
{
foreach (var scope in scopes)
{
if (await _scopeRepository.FindByNameAsync(scope) == null)
{
await _scopeManager.CreateAsync(new OpenIddictScopeDescriptor()
{
Name = scope,
DisplayName = scope + " access",
DisplayNames =
{
[CultureInfo.GetCultureInfo("zh-Hans")] = "Abp API 应用程序访问",
[CultureInfo.GetCultureInfo("en")] = "Abp API Application Access"
},
Resources =
{
scope
}
});
}
}
}
private async Task CreateApplicationAsync(IEnumerable<string> scopes)
{
var configurationSection = _configuration.GetSection("OpenIddict:Applications");
var vueClientId = configurationSection["VueAdmin:ClientId"];
if (!vueClientId.IsNullOrWhiteSpace())
{
var vueClientRootUrl = configurationSection["VueAdmin:RootUrl"].EnsureEndsWith('/');
if (await _applicationRepository.FindByClientIdAsync(vueClientId) == null)
{
var application = new OpenIddictApplicationDescriptor
{
ClientId = vueClientId,
ClientSecret = configurationSection["VueAdmin:ClientSecret"],
ApplicationType = OpenIddictConstants.ApplicationTypes.Web,
ConsentType = OpenIddictConstants.ConsentTypes.Explicit,
DisplayName = "Abp Vue Admin Client",
PostLogoutRedirectUris =
{
new Uri(vueClientRootUrl + "signout-callback"),
new Uri(vueClientRootUrl)
},
RedirectUris =
{
new Uri(vueClientRootUrl + "signin-callback"),
new Uri(vueClientRootUrl)
},
Permissions =
{
OpenIddictConstants.Permissions.Endpoints.Authorization,
OpenIddictConstants.Permissions.Endpoints.Token,
OpenIddictConstants.Permissions.Endpoints.DeviceAuthorization,
OpenIddictConstants.Permissions.Endpoints.Introspection,
OpenIddictConstants.Permissions.Endpoints.Revocation,
OpenIddictConstants.Permissions.Endpoints.EndSession,
OpenIddictConstants.Permissions.GrantTypes.AuthorizationCode,
OpenIddictConstants.Permissions.GrantTypes.Implicit,
OpenIddictConstants.Permissions.GrantTypes.Password,
OpenIddictConstants.Permissions.GrantTypes.RefreshToken,
OpenIddictConstants.Permissions.GrantTypes.DeviceCode,
OpenIddictConstants.Permissions.GrantTypes.ClientCredentials,
OpenIddictConstants.Permissions.ResponseTypes.Code,
OpenIddictConstants.Permissions.ResponseTypes.CodeIdToken,
OpenIddictConstants.Permissions.ResponseTypes.CodeIdTokenToken,
OpenIddictConstants.Permissions.ResponseTypes.CodeToken,
OpenIddictConstants.Permissions.ResponseTypes.IdToken,
OpenIddictConstants.Permissions.ResponseTypes.IdTokenToken,
OpenIddictConstants.Permissions.ResponseTypes.None,
OpenIddictConstants.Permissions.ResponseTypes.Token,
OpenIddictConstants.Permissions.Scopes.Roles,
OpenIddictConstants.Permissions.Scopes.Profile,
OpenIddictConstants.Permissions.Scopes.Email,
OpenIddictConstants.Permissions.Scopes.Address,
OpenIddictConstants.Permissions.Scopes.Phone,
}
};
foreach (var scope in scopes)
{
application.Permissions.AddIfNotContains(OpenIddictConstants.Permissions.Prefixes.Scope + scope);
}
await _applicationManager.CreateAsync(application);
var vueClientPermissions = new string[1]
{
"AbpIdentity.UserLookup"
};
await _permissionDataSeeder.SeedAsync(ClientPermissionValueProvider.ProviderName, vueClientId, vueClientPermissions);
}
}
var internalServiceClientId = configurationSection["InternalService:ClientId"];
if (!internalServiceClientId.IsNullOrWhiteSpace())
{
if (await _applicationRepository.FindByClientIdAsync(internalServiceClientId) == null)
{
var application = new OpenIddictApplicationDescriptor
{
ClientId = internalServiceClientId,
ClientSecret = configurationSection["InternalService:ClientSecret"],
ClientType = OpenIddictConstants.ClientTypes.Confidential,
ConsentType = OpenIddictConstants.ConsentTypes.Explicit,
ApplicationType = OpenIddictConstants.ApplicationTypes.Native,
DisplayName = "Abp Vue Admin Client",
Permissions =
{
OpenIddictConstants.Permissions.Endpoints.Authorization,
OpenIddictConstants.Permissions.Endpoints.Token,
OpenIddictConstants.Permissions.Endpoints.DeviceAuthorization,
OpenIddictConstants.Permissions.Endpoints.Introspection,
OpenIddictConstants.Permissions.Endpoints.Revocation,
OpenIddictConstants.Permissions.Endpoints.EndSession,
OpenIddictConstants.Permissions.GrantTypes.AuthorizationCode,
OpenIddictConstants.Permissions.GrantTypes.Implicit,
OpenIddictConstants.Permissions.GrantTypes.Password,
OpenIddictConstants.Permissions.GrantTypes.RefreshToken,
OpenIddictConstants.Permissions.GrantTypes.DeviceCode,
OpenIddictConstants.Permissions.GrantTypes.ClientCredentials,
OpenIddictConstants.Permissions.ResponseTypes.Code,
OpenIddictConstants.Permissions.ResponseTypes.CodeIdToken,
OpenIddictConstants.Permissions.ResponseTypes.CodeIdTokenToken,
OpenIddictConstants.Permissions.ResponseTypes.CodeToken,
OpenIddictConstants.Permissions.ResponseTypes.IdToken,
OpenIddictConstants.Permissions.ResponseTypes.IdTokenToken,
OpenIddictConstants.Permissions.ResponseTypes.None,
OpenIddictConstants.Permissions.ResponseTypes.Token,
OpenIddictConstants.Permissions.Scopes.Roles,
OpenIddictConstants.Permissions.Scopes.Profile,
OpenIddictConstants.Permissions.Scopes.Email,
OpenIddictConstants.Permissions.Scopes.Address,
OpenIddictConstants.Permissions.Scopes.Phone,
}
};
foreach (var scope in scopes)
{
application.Permissions.AddIfNotContains(OpenIddictConstants.Permissions.Prefixes.Scope + scope);
}
await _applicationManager.CreateAsync(application);
var internalServicePermissions = new string[2]
{
"AbpIdentity.UserLookup","AbpIdentity.Users"
};
await _permissionDataSeeder.SeedAsync(ClientPermissionValueProvider.ProviderName, internalServiceClientId, internalServicePermissions);
}
}
var oauthClientId = configurationSection["VueOAuthClient:ClientId"];
if (!oauthClientId.IsNullOrWhiteSpace())
{
var oauthClientRootUrls = configurationSection.GetSection("VueOAuthClient:RootUrls").Get<List<string>>();
if (await _applicationRepository.FindByClientIdAsync(oauthClientId) == null)
{
var application = new OpenIddictApplicationDescriptor
{
ClientId = oauthClientId,
ClientSecret = null,
ApplicationType = OpenIddictConstants.ApplicationTypes.Web,
ConsentType = OpenIddictConstants.ConsentTypes.Implicit,
DisplayName = "OAuth Client",
PostLogoutRedirectUris = { },
RedirectUris = { },
Permissions =
{
OpenIddictConstants.Permissions.Endpoints.Authorization,
OpenIddictConstants.Permissions.Endpoints.Token,
OpenIddictConstants.Permissions.Endpoints.DeviceAuthorization,
OpenIddictConstants.Permissions.Endpoints.Introspection,
OpenIddictConstants.Permissions.Endpoints.Revocation,
OpenIddictConstants.Permissions.Endpoints.EndSession,
OpenIddictConstants.Permissions.GrantTypes.AuthorizationCode,
OpenIddictConstants.Permissions.GrantTypes.RefreshToken,
OpenIddictConstants.Permissions.ResponseTypes.Code,
OpenIddictConstants.Permissions.ResponseTypes.CodeIdToken,
OpenIddictConstants.Permissions.ResponseTypes.CodeIdTokenToken,
OpenIddictConstants.Permissions.ResponseTypes.CodeToken,
OpenIddictConstants.Permissions.ResponseTypes.IdToken,
OpenIddictConstants.Permissions.ResponseTypes.IdTokenToken,
OpenIddictConstants.Permissions.ResponseTypes.None,
OpenIddictConstants.Permissions.ResponseTypes.Token,
OpenIddictConstants.Permissions.Scopes.Roles,
OpenIddictConstants.Permissions.Scopes.Profile,
OpenIddictConstants.Permissions.Scopes.Email,
OpenIddictConstants.Permissions.Scopes.Address,
OpenIddictConstants.Permissions.Scopes.Phone,
}
};
foreach (var scope in scopes)
{
application.Permissions.AddIfNotContains(OpenIddictConstants.Permissions.Prefixes.Scope + scope);
}
oauthClientRootUrls.ForEach(url =>
{
application.PostLogoutRedirectUris.AddIfNotContains(new Uri(url.EnsureEndsWith('/')));
application.PostLogoutRedirectUris.AddIfNotContains(new Uri(url.EnsureEndsWith('/') + "signout-callback"));
application.RedirectUris.AddIfNotContains(new Uri(url));
application.RedirectUris.AddIfNotContains(new Uri(url.EnsureEndsWith('/') + "signin-callback"));
application.RedirectUris.AddIfNotContains(new Uri(url.EnsureEndsWith('/') + "swagger/oauth2-redirect.html"));
});
await _applicationManager.CreateAsync(application);
var oauthClientPermissions = new string[1]
{
"AbpIdentity.UserLookup"
};
await _permissionDataSeeder.SeedAsync(ClientPermissionValueProvider.ProviderName, oauthClientId, oauthClientPermissions);
}
}
}
}

11
aspnet-core/aspire/LINGYUN.Abp.MicroService.AuthServer/LINGYUN.Abp.MicroService.AuthServer.csproj

@ -3,7 +3,7 @@
<Import Project="..\..\..\common.secrets.props" />
<PropertyGroup>
<TargetFramework>net9.0</TargetFramework>
<TargetFramework>net10.0</TargetFramework>
<RootNamespace>LINGYUN.Abp.MicroService.AuthServer</RootNamespace>
</PropertyGroup>
@ -78,10 +78,6 @@
<ProjectReference Include="..\LINGYUN.Abp.MicroService.ServiceDefaults\LINGYUN.Abp.MicroService.ServiceDefaults.csproj" />
</ItemGroup>
<ItemGroup>
<Folder Include="wwwroot\" />
</ItemGroup>
<Target Name="RestoreNpmPackages" BeforeTargets="BeforeBuild">
<Message Text="正在执行 abp install-libs ..." Importance="high" />
@ -89,10 +85,7 @@
<PackageJsonPath>$(MSBuildProjectDirectory)\package.json</PackageJsonPath>
</PropertyGroup>
<Exec Command="abp install-libs"
Condition="Exists('$(PackageJsonPath)')"
WorkingDirectory="$(MSBuildProjectDirectory)"
IgnoreExitCode="false" />
<Exec Command="abp install-libs" Condition="Exists('$(PackageJsonPath)')" WorkingDirectory="$(MSBuildProjectDirectory)" IgnoreExitCode="false" />
</Target>
</Project>

38
aspnet-core/aspire/LINGYUN.Abp.MicroService.AuthServer/appsettings.Development.json

@ -47,7 +47,7 @@
}
},
"ConnectionStrings": {
"Default": "Host=127.0.0.1;Database=abp;Username=postgres;Password=123456"
"Default": "Host=localhost;Database=abp;Username=postgres;Password=123456"
},
"CAP": {
"EventBus": {
@ -59,7 +59,7 @@
},
"PostgreSql": {
"TableNamePrefix": "auth",
"ConnectionString": "Host=127.0.0.1;Database=abp;Username=postgres;Password=123456"
"ConnectionString": "Host=localhost;Database=abp;Username=postgres;Password=123456"
},
"RabbitMQ": {
"HostName": "localhost",
@ -80,6 +80,9 @@
"Configuration": "localhost,defaultDatabase=10",
"InstanceName": "LINGYUN.Abp.Application"
},
"OssManagement": {
"Bucket": "users"
},
"RemoteServices": {
"Platform": {
"BaseUrl": "http://localhost:30025",
@ -88,38 +91,11 @@
},
"AuthServer": {
"Authority": "http://localhost:44385/",
"Audience": "lingyun-abp-application",
"Audience": "auth-server",
"ValidAudiences": [ "lingyun-abp-application" ],
"MapInboundClaims": false,
"RequireHttpsMetadata": false
},
"OpenIddict": {
"Applications": {
"VueAdmin": {
"ClientId": "vue-admin-client",
"ClientSecret": "1q2w3e*",
"RootUrl": "http://localhost:5666/"
},
"InternalService": {
"ClientId": "InternalServiceClient",
"ClientSecret": "1q2w3e*"
},
"VueOAuthClient": {
"ClientId": "vue-oauth-client",
"RootUrls": [
"http://localhost:5666",
"http://localhost:30010",
"http://localhost:30015",
"http://localhost:30020",
"http://localhost:30025",
"http://localhost:30030",
"http://localhost:30040",
"http://localhost:30045",
"http://localhost:30050",
"http://localhost:30060"
]
}
}
},
"Identity": {
"Password": {
"RequiredLength": 6,

6
aspnet-core/aspire/LINGYUN.Abp.MicroService.AuthServer/package.json

@ -1,9 +1,9 @@
{
"version": "9.3.6",
"version": "10.0.2",
"name": "my-app-authserver",
"private": true,
"dependencies": {
"@abp/aspnetcore.mvc.ui.theme.leptonxlite": "4.3.6",
"@abp/qrcode": "9.3.6"
"@abp/aspnetcore.mvc.ui.theme.leptonxlite": "5.0.2",
"@abp/qrcode": "10.0.2"
}
}

9
aspnet-core/aspire/LINGYUN.Abp.MicroService.AuthServer/wwwroot/css/global-styles.css

@ -0,0 +1,9 @@
.account-module-form {
padding: 24px;
border: 0;
background: #fff;
color: #000;
box-shadow: 0 0 30px rgba(8, 20, 73, .1);
border-radius: 4px;
margin-top: 0.75rem !important;
}

6
aspnet-core/aspire/LINGYUN.Abp.MicroService.IdentityService/IdentityServiceModule.cs

@ -128,10 +128,4 @@ public partial class IdentityServiceModule : AbpModule
ConfigureDistributedLocking(context.Services, configuration);
ConfigureSecurity(context.Services, configuration, hostingEnvironment.IsDevelopment());
}
public override void OnApplicationInitialization(ApplicationInitializationContext context)
{
var app = context.GetApplicationBuilder();
}
}

2
aspnet-core/aspire/LINGYUN.Abp.MicroService.IdentityService/LINGYUN.Abp.MicroService.IdentityService.csproj

@ -3,7 +3,7 @@
<Import Project="..\..\..\common.secrets.props" />
<PropertyGroup>
<TargetFramework>net9.0</TargetFramework>
<TargetFramework>net10.0</TargetFramework>
<RootNamespace>LINGYUN.Abp.MicroService.IdentityService</RootNamespace>
</PropertyGroup>

3
aspnet-core/aspire/LINGYUN.Abp.MicroService.IdentityService/appsettings.Development.json

@ -77,7 +77,8 @@
},
"AuthServer": {
"Authority": "http://localhost:44385",
"Audience": "lingyun-abp-application",
"Audience": "identity-service",
"ValidAudiences": [ "lingyun-abp-application" ],
"MapInboundClaims": false,
"RequireHttpsMetadata": false,
"SwaggerClientId": "vue-oauth-client"

2
aspnet-core/aspire/LINGYUN.Abp.MicroService.LocalizationService.DbMigrator/LINGYUN.Abp.MicroService.LocalizationService.DbMigrator.csproj

@ -4,7 +4,7 @@
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net9.0</TargetFramework>
<TargetFramework>net10.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
<IsPackable>false</IsPackable>

2
aspnet-core/aspire/LINGYUN.Abp.MicroService.LocalizationService.EntityFrameworkCore/LINGYUN.Abp.MicroService.LocalizationService.EntityFrameworkCore.csproj

@ -5,7 +5,7 @@
<PropertyGroup>
<IsPackable>false</IsPackable>
<TargetFramework>net9.0</TargetFramework>
<TargetFramework>net10.0</TargetFramework>
<RootNamespace>LINGYUN.Abp.MicroService.LocalizationService</RootNamespace>
</PropertyGroup>

2
aspnet-core/aspire/LINGYUN.Abp.MicroService.LocalizationService/LINGYUN.Abp.MicroService.LocalizationService.csproj

@ -3,7 +3,7 @@
<Import Project="..\..\..\common.secrets.props" />
<PropertyGroup>
<TargetFramework>net9.0</TargetFramework>
<TargetFramework>net10.0</TargetFramework>
<RootNamespace>LINGYUN.Abp.MicroService.LocalizationService</RootNamespace>
</PropertyGroup>

3
aspnet-core/aspire/LINGYUN.Abp.MicroService.LocalizationService/appsettings.Development.json

@ -57,7 +57,8 @@
},
"AuthServer": {
"Authority": "http://localhost:44385/",
"Audience": "lingyun-abp-application",
"Audience": "localization-service",
"ValidAudiences": [ "lingyun-abp-application" ],
"MapInboundClaims": false,
"RequireHttpsMetadata": false,
"SwaggerClientId": "vue-oauth-client"

2
aspnet-core/aspire/LINGYUN.Abp.MicroService.MessageService.DbMigrator/LINGYUN.Abp.MicroService.MessageService.DbMigrator.csproj

@ -4,7 +4,7 @@
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net9.0</TargetFramework>
<TargetFramework>net10.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
<IsPackable>false</IsPackable>

2
aspnet-core/aspire/LINGYUN.Abp.MicroService.MessageService.EntityFrameworkCore/LINGYUN.Abp.MicroService.MessageService.EntityFrameworkCore.csproj

@ -5,7 +5,7 @@
<PropertyGroup>
<IsPackable>false</IsPackable>
<TargetFramework>net9.0</TargetFramework>
<TargetFramework>net10.0</TargetFramework>
<RootNamespace>LINGYUN.Abp.MicroService.MessageService</RootNamespace>
</PropertyGroup>

2
aspnet-core/aspire/LINGYUN.Abp.MicroService.MessageService/LINGYUN.Abp.MicroService.MessageService.csproj

@ -3,7 +3,7 @@
<Import Project="..\..\..\common.secrets.props" />
<PropertyGroup>
<TargetFramework>net9.0</TargetFramework>
<TargetFramework>net10.0</TargetFramework>
<RootNamespace>LINGYUN.Abp.MicroService.MessageService</RootNamespace>
</PropertyGroup>

3
aspnet-core/aspire/LINGYUN.Abp.MicroService.MessageService/appsettings.Development.json

@ -57,7 +57,8 @@
},
"AuthServer": {
"Authority": "http://localhost:44385/",
"Audience": "lingyun-abp-application",
"Audience": "message-service",
"ValidAudiences": [ "lingyun-abp-application" ],
"MapInboundClaims": false,
"RequireHttpsMetadata": false,
"SwaggerClientId": "vue-oauth-client"

2
aspnet-core/aspire/LINGYUN.Abp.MicroService.PlatformService.DbMigrator/LINGYUN.Abp.MicroService.PlatformService.DbMigrator.csproj

@ -4,7 +4,7 @@
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net9.0</TargetFramework>
<TargetFramework>net10.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
<IsPackable>false</IsPackable>

3
aspnet-core/aspire/LINGYUN.Abp.MicroService.PlatformService.EntityFrameworkCore/LINGYUN.Abp.MicroService.PlatformService.EntityFrameworkCore.csproj

@ -5,7 +5,7 @@
<PropertyGroup>
<IsPackable>false</IsPackable>
<TargetFramework>net9.0</TargetFramework>
<TargetFramework>net10.0</TargetFramework>
<RootNamespace>LINGYUN.Abp.MicroService.PlatformService</RootNamespace>
</PropertyGroup>
@ -25,6 +25,7 @@
<ProjectReference Include="..\..\framework\navigation\LINGYUN.Abp.UI.Navigation\LINGYUN.Abp.UI.Navigation.csproj" />
<ProjectReference Include="..\..\modules\platform\LINGYUN.Platform.EntityFrameworkCore\LINGYUN.Platform.EntityFrameworkCore.csproj" />
<ProjectReference Include="..\..\modules\saas\LINGYUN.Abp.Saas.EntityFrameworkCore\LINGYUN.Abp.Saas.EntityFrameworkCore.csproj" />
<ProjectReference Include="..\..\modules\platform\LINGYUN.Abp.UI.Navigation.VueVbenAdmin5\LINGYUN.Abp.UI.Navigation.VueVbenAdmin5.csproj" />
</ItemGroup>
</Project>

47
aspnet-core/aspire/LINGYUN.Abp.MicroService.PlatformService.EntityFrameworkCore/PlatformServiceDataSeeder.cs

@ -0,0 +1,47 @@
using LINGYUN.Abp.UI.Navigation;
using System.Collections.Generic;
using System.Threading.Tasks;
using Volo.Abp.Data;
using Volo.Abp.DependencyInjection;
using Volo.Abp.MultiTenancy;
namespace LINGYUN.Abp.MicroService.PlatformService;
public class PlatformServiceDataSeeder : ITransientDependency
{
protected IEnumerable<INavigationSeedContributor> NavigationSeedContributors { get; }
protected INavigationProvider NavigationProvider { get; }
protected ICurrentTenant CurrentTenant { get; }
public PlatformServiceDataSeeder(
IEnumerable<INavigationSeedContributor> navigationSeedContributors,
INavigationProvider navigationProvider,
ICurrentTenant currentTenant)
{
NavigationSeedContributors = navigationSeedContributors;
NavigationProvider = navigationProvider;
CurrentTenant = currentTenant;
}
public async virtual Task SeedAsync(DataSeedContext context)
{
using (CurrentTenant.Change(context.TenantId))
{
await SeedNavigationAsync();
}
}
private async Task SeedNavigationAsync()
{
var menus = await NavigationProvider.GetAllAsync();
var multiTenancySides = CurrentTenant.IsAvailable
? MultiTenancySides.Tenant
: MultiTenancySides.Host;
var seedContext = new NavigationSeedContext(menus, multiTenancySides);
foreach (var contributor in NavigationSeedContributors)
{
await contributor.SeedAsync(seedContext);
}
}
}

35
aspnet-core/aspire/LINGYUN.Abp.MicroService.PlatformService.EntityFrameworkCore/PlatformServiceDbMigrationEventHandler.cs

@ -1,10 +1,8 @@
using LINGYUN.Abp.Saas.Tenants;
using LINGYUN.Abp.UI.Navigation;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.Logging;
using System;
using System.Collections.Generic;
using System.Data.Common;
using System.Linq;
using System.Threading.Tasks;
@ -12,7 +10,6 @@ using Volo.Abp.Data;
using Volo.Abp.DistributedLocking;
using Volo.Abp.EntityFrameworkCore.Migrations;
using Volo.Abp.EventBus.Distributed;
using Volo.Abp.Features;
using Volo.Abp.MultiTenancy;
using Volo.Abp.Uow;
@ -21,9 +18,7 @@ public class PlatformServiceDbMigrationEventHandler :
EfCoreDatabaseMigrationEventHandlerBase<PlatformServiceMigrationsDbContext>,
IDistributedEventHandler<TenantDeletedEto>
{
protected IEnumerable<INavigationSeedContributor> NavigationSeedContributors { get; }
protected INavigationProvider NavigationProvider { get; }
protected IFeatureChecker FeatureChecker { get; }
protected PlatformServiceDataSeeder DataSeeder { get; }
protected IConfiguration Configuration { get; }
public PlatformServiceDbMigrationEventHandler(
ICurrentTenant currentTenant,
@ -32,37 +27,29 @@ public class PlatformServiceDbMigrationEventHandler :
IAbpDistributedLock abpDistributedLock,
IDistributedEventBus distributedEventBus,
ILoggerFactory loggerFactory,
IFeatureChecker featureChecker,
IConfiguration configuration,
INavigationProvider navigationProvider,
IEnumerable<INavigationSeedContributor> navigationSeedContributors)
PlatformServiceDataSeeder dataSeeder)
: base(
ConnectionStringNameAttribute.GetConnStringName<PlatformServiceMigrationsDbContext>(),
currentTenant, unitOfWorkManager, tenantStore, abpDistributedLock, distributedEventBus, loggerFactory)
{
FeatureChecker = featureChecker;
Configuration = configuration;
NavigationProvider = navigationProvider;
NavigationSeedContributors = navigationSeedContributors;
DataSeeder = dataSeeder;
}
protected async override Task SeedAsync(Guid? tenantId)
protected async override Task AfterTenantCreated(TenantCreatedEto eventData, bool schemaMigrated)
{
using (CurrentTenant.Change(tenantId))
// 新租户数据种子
var context = new DataSeedContext(eventData.Id);
if (eventData.Properties != null)
{
var menus = await NavigationProvider.GetAllAsync();
var multiTenancySides = CurrentTenant.IsAvailable
? MultiTenancySides.Tenant
: MultiTenancySides.Host;
var seedContext = new NavigationSeedContext(menus, multiTenancySides);
foreach (var contributor in NavigationSeedContributors)
foreach (var property in eventData.Properties)
{
await contributor.SeedAsync(seedContext);
context.WithProperty(property.Key, property.Value);
}
}
await DataSeeder.SeedAsync(context);
}
public async virtual Task HandleEventAsync(TenantDeletedEto eventData)

12
aspnet-core/aspire/LINGYUN.Abp.MicroService.PlatformService.EntityFrameworkCore/PlatformServiceDbMigrationService.cs

@ -1,6 +1,7 @@
using LINGYUN.Abp.Data.DbMigrator;
using Microsoft.Extensions.Logging;
using System;
using System.Threading.Tasks;
using Volo.Abp.Data;
using Volo.Abp.DependencyInjection;
using Volo.Abp.DistributedLocking;
@ -11,16 +12,25 @@ using Volo.Abp.Uow;
namespace LINGYUN.Abp.MicroService.PlatformService;
public class PlatformServiceDbMigrationService : EfCoreRuntimeDbMigratorBase<PlatformServiceMigrationsDbContext>, ITransientDependency
{
protected PlatformServiceDataSeeder DataSeeder { get; }
public PlatformServiceDbMigrationService(
ICurrentTenant currentTenant,
IUnitOfWorkManager unitOfWorkManager,
IServiceProvider serviceProvider,
IAbpDistributedLock abpDistributedLock,
IDistributedEventBus distributedEventBus,
ILoggerFactory loggerFactory)
ILoggerFactory loggerFactory,
PlatformServiceDataSeeder dataSeeder)
: base(
ConnectionStringNameAttribute.GetConnStringName<PlatformServiceMigrationsDbContext>(),
unitOfWorkManager, serviceProvider, currentTenant, abpDistributedLock, distributedEventBus, loggerFactory)
{
DataSeeder = dataSeeder;
}
protected async override Task SeedAsync()
{
// DbMigrator迁移数据种子
await DataSeeder.SeedAsync(new DataSeedContext());
}
}

4
aspnet-core/aspire/LINGYUN.Abp.MicroService.PlatformService.EntityFrameworkCore/PlatformServiceMigrationsEntityFrameworkCoreModule.cs

@ -1,6 +1,6 @@
using LINGYUN.Abp.Data.DbMigrator;
using LINGYUN.Abp.Saas.EntityFrameworkCore;
using LINGYUN.Abp.UI.Navigation;
using LINGYUN.Abp.UI.Navigation.VueVbenAdmin5;
using LINGYUN.Platform.EntityFrameworkCore;
using Microsoft.Extensions.DependencyInjection;
using System;
@ -14,7 +14,7 @@ using Volo.Abp.SettingManagement.EntityFrameworkCore;
namespace LINGYUN.Abp.MicroService.PlatformService;
[DependsOn(
typeof(AbpUINavigationModule),
typeof(AbpUINavigationVueVbenAdmin5Module),
typeof(AbpSaasEntityFrameworkCoreModule),
typeof(PlatformEntityFrameworkCoreModule),
typeof(AbpSettingManagementEntityFrameworkCoreModule),

4
aspnet-core/aspire/LINGYUN.Abp.MicroService.PlatformService/LINGYUN.Abp.MicroService.PlatformService.csproj

@ -1,7 +1,7 @@
<Project Sdk="Microsoft.NET.Sdk.Web">
<PropertyGroup>
<TargetFramework>net9.0</TargetFramework>
<TargetFramework>net10.0</TargetFramework>
<Nullable>enable</Nullable>
<ImplicitUsings>enable</ImplicitUsings>
<RootNamespace>LINGYUN.Abp.MicroService.PlatformService</RootNamespace>
@ -72,11 +72,9 @@
<ProjectReference Include="..\..\modules\oss-management\LINGYUN.Abp.OssManagement.Tencent\LINGYUN.Abp.OssManagement.Tencent.csproj" />
<ProjectReference Include="..\..\modules\platform\LINGYUN.Abp.Emailing.Platform\LINGYUN.Abp.Emailing.Platform.csproj" />
<ProjectReference Include="..\..\modules\platform\LINGYUN.Abp.Sms.Platform\LINGYUN.Abp.Sms.Platform.csproj" />
<ProjectReference Include="..\..\modules\platform\LINGYUN.Abp.UI.Navigation.VueVbenAdmin5\LINGYUN.Abp.UI.Navigation.VueVbenAdmin5.csproj" />
<ProjectReference Include="..\..\modules\platform\LINGYUN.Platform.Application\LINGYUN.Platform.Application.csproj" />
<ProjectReference Include="..\..\modules\platform\LINGYUN.Platform.EntityFrameworkCore\LINGYUN.Platform.EntityFrameworkCore.csproj" />
<ProjectReference Include="..\..\modules\platform\LINGYUN.Platform.HttpApi\LINGYUN.Platform.HttpApi.csproj" />
<ProjectReference Include="..\..\modules\platform\LINGYUN.Platform.Theme.VueVbenAdmin\LINGYUN.Platform.Theme.VueVbenAdmin.csproj" />
<ProjectReference Include="..\..\modules\realtime-notifications\LINGYUN.Abp.Notifications\LINGYUN.Abp.Notifications.csproj" />
<ProjectReference Include="..\..\modules\saas\LINGYUN.Abp.Saas.EntityFrameworkCore\LINGYUN.Abp.Saas.EntityFrameworkCore.csproj" />
</ItemGroup>

9
aspnet-core/aspire/LINGYUN.Abp.MicroService.PlatformService/PlatformServiceModule.cs

@ -25,11 +25,9 @@ using LINGYUN.Abp.Saas.EntityFrameworkCore;
using LINGYUN.Abp.Serilog.Enrichers.Application;
using LINGYUN.Abp.Serilog.Enrichers.UniqueId;
using LINGYUN.Abp.Sms.Aliyun;
using LINGYUN.Abp.UI.Navigation.VueVbenAdmin5;
using LINGYUN.Platform;
using LINGYUN.Platform.EntityFrameworkCore;
using LINGYUN.Platform.HttpApi;
using LINGYUN.Platform.Theme.VueVbenAdmin;
using Microsoft.Extensions.Options;
using Volo.Abp;
using Volo.Abp.AspNetCore.Authentication.JwtBearer;
@ -38,7 +36,6 @@ using Volo.Abp.AspNetCore.Serilog;
using Volo.Abp.Autofac;
using Volo.Abp.BackgroundWorkers;
using Volo.Abp.Caching.StackExchangeRedis;
using Volo.Abp.Data;
using Volo.Abp.FeatureManagement.EntityFrameworkCore;
using Volo.Abp.Http.Client;
using Volo.Abp.Http.Client.IdentityModel.Web;
@ -60,8 +57,6 @@ namespace LINGYUN.Abp.MicroService.PlatformService;
typeof(AbpAuditLoggingElasticsearchModule),
typeof(AbpAspNetCoreMultiTenancyModule),
typeof(AbpAspNetCoreMvcLocalizationModule),
typeof(AbpUINavigationVueVbenAdmin5Module),
typeof(PlatformThemeVueVbenAdminModule),
typeof(AbpOssManagementAliyunModule), // 阿里云存储提供者模块
typeof(AbpOssManagementTencentModule), // 腾讯云存储提供者模块
typeof(AbpOssManagementNexusModule), // Nexus存储提供者模块
@ -151,10 +146,6 @@ public partial class PlatformServiceModule : AbpModule
public async override Task OnApplicationInitializationAsync(ApplicationInitializationContext context)
{
await context.ServiceProvider
.GetRequiredService<IDataSeeder>()
.SeedAsync();
var options = context.ServiceProvider.GetRequiredService<IOptions<AbpOssManagementOptions>>().Value;
if (options.IsCleanupEnabled)
{

3
aspnet-core/aspire/LINGYUN.Abp.MicroService.PlatformService/appsettings.Development.json

@ -82,7 +82,8 @@
},
"AuthServer": {
"Authority": "http://localhost:44385/",
"Audience": "lingyun-abp-application",
"Audience": "platform-service",
"ValidAudiences": [ "lingyun-abp-application" ],
"MapInboundClaims": false,
"RequireHttpsMetadata": false,
"SwaggerClientId": "vue-oauth-client"

2
aspnet-core/aspire/LINGYUN.Abp.MicroService.ServiceDefaults/LINGYUN.Abp.MicroService.ServiceDefaults.csproj

@ -1,7 +1,7 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net9.0</TargetFramework>
<TargetFramework>net10.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
<IsAspireSharedProject>true</IsAspireSharedProject>

2
aspnet-core/aspire/LINGYUN.Abp.MicroService.TaskService.DbMigrator/LINGYUN.Abp.MicroService.TaskService.DbMigrator.csproj

@ -4,7 +4,7 @@
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net9.0</TargetFramework>
<TargetFramework>net10.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
<IsPackable>false</IsPackable>

2
aspnet-core/aspire/LINGYUN.Abp.MicroService.TaskService.EntityFrameworkCore/LINGYUN.Abp.MicroService.TaskService.EntityFrameworkCore.csproj

@ -4,7 +4,7 @@
<Import Project="..\..\..\common.props" />
<PropertyGroup>
<TargetFramework>net9.0</TargetFramework>
<TargetFramework>net10.0</TargetFramework>
<RootNamespace>LINGYUN.Abp.MicroService.TaskService</RootNamespace>
</PropertyGroup>

139
aspnet-core/aspire/LINGYUN.Abp.MicroService.TaskService.EntityFrameworkCore/TaskServiceDataSeeder.cs

@ -0,0 +1,139 @@
using LINGYUN.Abp.BackgroundTasks;
using LINGYUN.Abp.BackgroundTasks.Internal;
using Microsoft.Extensions.Options;
using System;
using System.Collections.Generic;
using System.Threading.Tasks;
using Volo.Abp.Data;
using Volo.Abp.DependencyInjection;
using Volo.Abp.MultiTenancy;
namespace LINGYUN.Abp.MicroService.TaskService;
public class TaskServiceDataSeeder : ITransientDependency
{
protected AbpBackgroundTasksOptions Options { get; }
protected IJobStore JobStore { get; }
protected IJobScheduler JobScheduler { get; }
protected ICurrentTenant CurrentTenant { get; }
public TaskServiceDataSeeder(
IOptions<AbpBackgroundTasksOptions> options,
IJobStore jobStore,
IJobScheduler jobScheduler,
ICurrentTenant currentTenant)
{
Options = options.Value;
JobStore = jobStore;
JobScheduler = jobScheduler;
CurrentTenant = currentTenant;
}
public async virtual Task SeedAsync(DataSeedContext context)
{
if (context.TenantId.HasValue)
{
using (CurrentTenant.Change(context.TenantId))
{
await QueueBackgroundJobAsync(context.TenantId.Value);
}
}
}
public async virtual Task RemoveSeedAsync(Guid tenantId)
{
using (CurrentTenant.Change(tenantId))
{
var pollingJob = BuildPollingJobInfo(tenantId);
await JobScheduler.RemoveAsync(pollingJob);
await JobStore.RemoveAsync(pollingJob.Id);
var cleaningJob = BuildCleaningJobInfo(tenantId);
await JobScheduler.RemoveAsync(cleaningJob);
await JobStore.RemoveAsync(cleaningJob.Id);
var checkingJob = BuildCheckingJobInfo(tenantId);
await JobScheduler.RemoveAsync(checkingJob);
await JobStore.RemoveAsync(checkingJob.Id);
}
}
protected async virtual Task QueueBackgroundJobAsync(Guid tenantId)
{
var pollingJob = BuildPollingJobInfo(tenantId);
await JobStore.StoreAsync(pollingJob);
await JobScheduler.QueueAsync(pollingJob);
var cleaningJob = BuildCleaningJobInfo(tenantId);
await JobStore.StoreAsync(cleaningJob);
await JobScheduler.QueueAsync(cleaningJob);
var checkingJob = BuildCheckingJobInfo(tenantId);
await JobStore.StoreAsync(checkingJob);
await JobScheduler.QueueAsync(checkingJob);
}
protected virtual JobInfo BuildPollingJobInfo(Guid tenantId)
{
return new JobInfo
{
Id = tenantId.ToString() + "_Polling",
Name = nameof(BackgroundPollingJob),
Group = "Polling",
Description = "Polling tasks to be executed",
Args = new Dictionary<string, object>() { { nameof(JobInfo.TenantId), tenantId } },
Status = JobStatus.Running,
BeginTime = DateTime.Now,
CreationTime = DateTime.Now,
Cron = Options.JobFetchCronExpression,
JobType = JobType.Period,
Priority = JobPriority.High,
Source = JobSource.System,
LockTimeOut = Options.JobFetchLockTimeOut,
TenantId = tenantId,
Type = typeof(BackgroundPollingJob).AssemblyQualifiedName,
};
}
protected virtual JobInfo BuildCleaningJobInfo(Guid tenantId)
{
return new JobInfo
{
Id = tenantId.ToString() + "_Cleaning",
Name = nameof(BackgroundCleaningJob),
Group = "Cleaning",
Description = "Cleaning tasks to be executed",
Args = new Dictionary<string, object>() { { nameof(JobInfo.TenantId), tenantId } },
Status = JobStatus.Running,
BeginTime = DateTime.Now,
CreationTime = DateTime.Now,
Cron = Options.JobCleanCronExpression,
JobType = JobType.Period,
Priority = JobPriority.High,
Source = JobSource.System,
TenantId = tenantId,
Type = typeof(BackgroundCleaningJob).AssemblyQualifiedName,
};
}
protected virtual JobInfo BuildCheckingJobInfo(Guid tenantId)
{
return new JobInfo
{
Id = tenantId.ToString() + "_Checking",
Name = nameof(BackgroundCheckingJob),
Group = "Checking",
Description = "Checking tasks to be executed",
Args = new Dictionary<string, object>() { { nameof(JobInfo.TenantId), tenantId } },
Status = JobStatus.Running,
BeginTime = DateTime.Now,
CreationTime = DateTime.Now,
Cron = Options.JobCheckCronExpression,
LockTimeOut = Options.JobCheckLockTimeOut,
JobType = JobType.Period,
Priority = JobPriority.High,
Source = JobSource.System,
TenantId = tenantId,
Type = typeof(BackgroundCheckingJob).AssemblyQualifiedName,
};
}
}

122
aspnet-core/aspire/LINGYUN.Abp.MicroService.TaskService.EntityFrameworkCore/TaskServiceDbMigrationEventHandler.cs

@ -1,10 +1,5 @@
using LINGYUN.Abp.BackgroundTasks;
using LINGYUN.Abp.BackgroundTasks.Internal;
using LINGYUN.Abp.Saas.Tenants;
using LINGYUN.Abp.Saas.Tenants;
using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Options;
using System;
using System.Collections.Generic;
using System.Threading.Tasks;
using Volo.Abp.Data;
using Volo.Abp.DistributedLocking;
@ -19,9 +14,7 @@ public class TaskServiceDbMigrationEventHandler :
EfCoreDatabaseMigrationEventHandlerBase<TaskServiceMigrationsDbContext>,
IDistributedEventHandler<EntityDeletedEto<TenantEto>>
{
protected AbpBackgroundTasksOptions Options { get; }
protected IJobStore JobStore { get; }
protected IJobScheduler JobScheduler { get; }
protected TaskServiceDataSeeder DataSeeder { get; }
public TaskServiceDbMigrationEventHandler(
ICurrentTenant currentTenant,
@ -30,122 +23,33 @@ public class TaskServiceDbMigrationEventHandler :
IAbpDistributedLock abpDistributedLock,
IDistributedEventBus distributedEventBus,
ILoggerFactory loggerFactory,
IJobStore jobStore,
IJobScheduler jobScheduler,
IOptions<AbpBackgroundTasksOptions> options)
TaskServiceDataSeeder dataSeeder)
: base(
ConnectionStringNameAttribute.GetConnStringName<TaskServiceMigrationsDbContext>(),
currentTenant, unitOfWorkManager, tenantStore, abpDistributedLock, distributedEventBus, loggerFactory)
{
JobStore = jobStore;
JobScheduler = jobScheduler;
Options = options.Value;
DataSeeder = dataSeeder;
}
public async Task HandleEventAsync(EntityDeletedEto<TenantEto> eventData)
{
// 租户删除时移除轮询作业
var pollingJob = BuildPollingJobInfo(eventData.Entity.Id, eventData.Entity.Name);
await JobScheduler.RemoveAsync(pollingJob);
await JobStore.RemoveAsync(pollingJob.Id);
var cleaningJob = BuildCleaningJobInfo(eventData.Entity.Id, eventData.Entity.Name);
await JobScheduler.RemoveAsync(cleaningJob);
await JobStore.RemoveAsync(cleaningJob.Id);
var checkingJob = BuildCheckingJobInfo(eventData.Entity.Id, eventData.Entity.Name);
await JobScheduler.RemoveAsync(checkingJob);
await JobStore.RemoveAsync(checkingJob.Id);
await DataSeeder.RemoveSeedAsync(eventData.Entity.Id);
}
protected async override Task AfterTenantCreated(TenantCreatedEto eventData, bool schemaMigrated)
{
if (!schemaMigrated)
// 新租户数据种子
var context = new DataSeedContext(eventData.Id);
if (eventData.Properties != null)
{
return;
foreach (var property in eventData.Properties)
{
context.WithProperty(property.Key, property.Value);
}
}
await QueueBackgroundJobAsync(eventData);
}
protected async virtual Task QueueBackgroundJobAsync(TenantCreatedEto eventData)
{
var pollingJob = BuildPollingJobInfo(eventData.Id, eventData.Name);
await JobStore.StoreAsync(pollingJob);
await JobScheduler.QueueAsync(pollingJob);
var cleaningJob = BuildCleaningJobInfo(eventData.Id, eventData.Name);
await JobStore.StoreAsync(cleaningJob);
await JobScheduler.QueueAsync(cleaningJob);
var checkingJob = BuildCheckingJobInfo(eventData.Id, eventData.Name);
await JobStore.StoreAsync(checkingJob);
await JobScheduler.QueueAsync(checkingJob);
}
protected virtual JobInfo BuildPollingJobInfo(Guid tenantId, string tenantName)
{
return new JobInfo
{
Id = tenantId.ToString() + "_Polling",
Name = nameof(BackgroundPollingJob),
Group = "Polling",
Description = "Polling tasks to be executed",
Args = new Dictionary<string, object>() { { nameof(JobInfo.TenantId), tenantId } },
Status = JobStatus.Running,
BeginTime = DateTime.Now,
CreationTime = DateTime.Now,
Cron = Options.JobFetchCronExpression,
JobType = JobType.Period,
Priority = JobPriority.High,
Source = JobSource.System,
LockTimeOut = Options.JobFetchLockTimeOut,
TenantId = tenantId,
Type = typeof(BackgroundPollingJob).AssemblyQualifiedName,
};
}
protected virtual JobInfo BuildCleaningJobInfo(Guid tenantId, string tenantName)
{
return new JobInfo
{
Id = tenantId.ToString() + "_Cleaning",
Name = nameof(BackgroundCleaningJob),
Group = "Cleaning",
Description = "Cleaning tasks to be executed",
Args = new Dictionary<string, object>() { { nameof(JobInfo.TenantId), tenantId } },
Status = JobStatus.Running,
BeginTime = DateTime.Now,
CreationTime = DateTime.Now,
Cron = Options.JobCleanCronExpression,
JobType = JobType.Period,
Priority = JobPriority.High,
Source = JobSource.System,
TenantId = tenantId,
Type = typeof(BackgroundCleaningJob).AssemblyQualifiedName,
};
}
protected virtual JobInfo BuildCheckingJobInfo(Guid tenantId, string tenantName)
{
return new JobInfo
{
Id = tenantId.ToString() + "_Checking",
Name = nameof(BackgroundCheckingJob),
Group = "Checking",
Description = "Checking tasks to be executed",
Args = new Dictionary<string, object>() { { nameof(JobInfo.TenantId), tenantId } },
Status = JobStatus.Running,
BeginTime = DateTime.Now,
CreationTime = DateTime.Now,
Cron = Options.JobCheckCronExpression,
LockTimeOut = Options.JobCheckLockTimeOut,
JobType = JobType.Period,
Priority = JobPriority.High,
Source = JobSource.System,
TenantId = tenantId,
Type = typeof(BackgroundCheckingJob).AssemblyQualifiedName,
};
await DataSeeder.SeedAsync(context);
}
}

2
aspnet-core/aspire/LINGYUN.Abp.MicroService.TaskService/LINGYUN.Abp.MicroService.TaskService.csproj

@ -3,7 +3,7 @@
<Import Project="..\..\..\common.secrets.props" />
<PropertyGroup>
<TargetFramework>net9.0</TargetFramework>
<TargetFramework>net10.0</TargetFramework>
<RootNamespace>LINGYUN.Abp.MicroService.TaskService</RootNamespace>
</PropertyGroup>

7
aspnet-core/aspire/LINGYUN.Abp.MicroService.TaskService/appsettings.Development.json

@ -84,10 +84,9 @@
},
"AuthServer": {
"Authority": "http://localhost:44385/",
"Audience": "lingyun-abp-application",
"Scopes": "lingyun-abp-application",
"SwaggerClientId": "InternalServiceClient",
"SwaggerClientSecret": "1q2w3E*",
"Audience": "task-service",
"ValidAudiences": [ "lingyun-abp-application" ],
"SwaggerClientId": "vue-oauth-client",
"MapInboundClaims": false,
"RequireHttpsMetadata": false
},

2
aspnet-core/aspire/LINGYUN.Abp.MicroService.WeChatService/LINGYUN.Abp.MicroService.WeChatService.csproj

@ -3,7 +3,7 @@
<Import Project="..\..\..\common.secrets.props" />
<PropertyGroup>
<TargetFramework>net9.0</TargetFramework>
<TargetFramework>net10.0</TargetFramework>
<RootNamespace>LINGYUN.Abp.MicroService.WeChatService</RootNamespace>
</PropertyGroup>

6
aspnet-core/aspire/LINGYUN.Abp.MicroService.WeChatService/appsettings.Development.json

@ -68,11 +68,11 @@
},
"AuthServer": {
"Authority": "http://localhost:44385/",
"Audience": "lingyun-abp-application",
"Audience": "wechat-service",
"ValidAudiences": [ "lingyun-abp-application" ],
"MapInboundClaims": false,
"RequireHttpsMetadata": false,
"SwaggerClientId": "InternalServiceClient",
"SwaggerClientSecret": "1q2w3E*"
"SwaggerClientId": "vue-oauth-client"
},
"Logging": {
"Serilog": {

2
aspnet-core/aspire/LINGYUN.Abp.MicroService.WebhookService.DbMigrator/LINGYUN.Abp.MicroService.WebhookService.DbMigrator.csproj

@ -4,7 +4,7 @@
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net9.0</TargetFramework>
<TargetFramework>net10.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
<IsPackable>false</IsPackable>

2
aspnet-core/aspire/LINGYUN.Abp.MicroService.WebhookService.EntityFrameworkCore/LINGYUN.Abp.MicroService.WebhookService.EntityFrameworkCore.csproj

@ -5,7 +5,7 @@
<PropertyGroup>
<IsPackable>false</IsPackable>
<TargetFramework>net9.0</TargetFramework>
<TargetFramework>net10.0</TargetFramework>
<RootNamespace>LINGYUN.Abp.MicroService.WebhookService</RootNamespace>
</PropertyGroup>

3
aspnet-core/aspire/LINGYUN.Abp.MicroService.WebhookService.EntityFrameworkCore/WebhookServiceDbMigrationEventHandler.cs

@ -15,8 +15,7 @@ public class WebhookServiceDbMigrationEventHandler : EfCoreDatabaseMigrationEven
ITenantStore tenantStore,
IAbpDistributedLock abpDistributedLock,
IDistributedEventBus distributedEventBus,
ILoggerFactory loggerFactory,
IDataSeeder dataSeeder)
ILoggerFactory loggerFactory)
: base(
ConnectionStringNameAttribute.GetConnStringName<WebhookServiceMigrationsDbContext>(),
currentTenant, unitOfWorkManager, tenantStore, abpDistributedLock, distributedEventBus, loggerFactory)

2
aspnet-core/aspire/LINGYUN.Abp.MicroService.WebhookService/LINGYUN.Abp.MicroService.WebhookService.csproj

@ -3,7 +3,7 @@
<Import Project="..\..\..\common.secrets.props" />
<PropertyGroup>
<TargetFramework>net9.0</TargetFramework>
<TargetFramework>net10.0</TargetFramework>
<RootNamespace>LINGYUN.Abp.MicroService.WebhookService</RootNamespace>
</PropertyGroup>

3
aspnet-core/aspire/LINGYUN.Abp.MicroService.WebhookService/appsettings.Development.json

@ -87,7 +87,8 @@
},
"AuthServer": {
"Authority": "http://localhost:44385/",
"Audience": "lingyun-abp-application",
"Audience": "webhook-service",
"ValidAudiences": [ "lingyun-abp-application" ],
"MapInboundClaims": false,
"RequireHttpsMetadata": false,
"SwaggerClientId": "vue-oauth-client"

2
aspnet-core/aspire/LINGYUN.Abp.MicroService.WorkflowService/LINGYUN.Abp.MicroService.WorkflowService.csproj

@ -3,7 +3,7 @@
<Import Project="..\..\..\common.secrets.props" />
<PropertyGroup>
<TargetFramework>net9.0</TargetFramework>
<TargetFramework>net10.0</TargetFramework>
<RootNamespace>LINGYUN.Abp.MicroService.WorkflowService</RootNamespace>
</PropertyGroup>

4
aspnet-core/aspire/LINGYUN.Abp.MicroService.WorkflowService/appsettings.Development.json

@ -154,10 +154,10 @@
},
"AuthServer": {
"Authority": "http://localhost:44385/",
"Audience": "lingyun-abp-application",
"Audience": "workflow-service",
"ValidAudiences": [ "lingyun-abp-application" ],
"MapInboundClaims": false,
"RequireHttpsMetadata": false,
"Scopes": "lingyun-abp-application",
"ElsaClientId": "InternalServiceClient",
"SwaggerClientId": "vue-oauth-client"
},

2
aspnet-core/framework/auditing/LINGYUN.Abp.AspNetCore.Auditing/LINGYUN.Abp.AspNetCore.Auditing.csproj

@ -4,7 +4,7 @@
<Import Project="..\..\..\..\common.props" />
<PropertyGroup>
<TargetFramework>net9.0</TargetFramework>
<TargetFramework>net10.0</TargetFramework>
<AssemblyName>LINGYUN.Abp.AspNetCore.Auditing</AssemblyName>
<PackageId>LINGYUN.Abp.AspNetCore.Auditing</PackageId>
<GenerateAssemblyConfigurationAttribute>false</GenerateAssemblyConfigurationAttribute>

2
aspnet-core/framework/auditing/LINGYUN.Abp.AuditLogging.Elasticsearch/LINGYUN.Abp.AuditLogging.Elasticsearch.csproj

@ -4,7 +4,7 @@
<Import Project="..\..\..\..\common.props" />
<PropertyGroup>
<TargetFrameworks>netstandard2.0;netstandard2.1;net8.0;net9.0</TargetFrameworks>
<TargetFrameworks>netstandard2.0;netstandard2.1;net8.0;net9.0;net10.0</TargetFrameworks>
<AssemblyName>LINGYUN.Abp.AuditLogging.Elasticsearch</AssemblyName>
<PackageId>LINGYUN.Abp.AuditLogging.Elasticsearch</PackageId>
<GenerateAssemblyConfigurationAttribute>false</GenerateAssemblyConfigurationAttribute>

43
aspnet-core/framework/auditing/LINGYUN.Abp.AuditLogging.Elasticsearch/LINGYUN/Abp/AuditLogging/Elasticsearch/AbpAuditLoggingElasticsearchOptions.cs

@ -1,4 +1,4 @@
using Nest;
using Elastic.Clients.Elasticsearch.IndexManagement;
namespace LINGYUN.Abp.AuditLogging.Elasticsearch;
@ -6,11 +6,48 @@ public class AbpAuditLoggingElasticsearchOptions
{
public const string DefaultIndexPrefix = "auditlogging";
public string IndexPrefix { get; set; }
public IIndexSettings IndexSettings { get; set; }
/// <summary>
/// 是否启用审计日志记录
/// </summary>
public bool IsAuditLogEnabled { get; set; }
/// <summary>
/// 审计日志索引设置
/// </summary>
public IndexSettings AuditLogSettings { get; set; }
/// <summary>
/// 是否启用安全日志记录
/// </summary>
public bool IsSecurityLogEnabled { get; set; }
/// <summary>
/// 安全日志索引设置
/// </summary>
public IndexSettings SecurityLogSettings { get; set; }
public AbpAuditLoggingElasticsearchOptions()
{
IndexPrefix = DefaultIndexPrefix;
IndexSettings = new IndexSettings();
IsAuditLogEnabled = true;
AuditLogSettings = new IndexSettings()
{
NumberOfReplicas = 1,
NumberOfShards = 3,
Mapping = new MappingLimitSettings
{
TotalFields = new MappingLimitSettingsTotalFields
{
Limit = 1000,
},
NestedFields = new MappingLimitSettingsNestedFields
{
Limit = 50,
},
Depth = new MappingLimitSettingsDepth
{
Limit = 10,
},
}
};
IsSecurityLogEnabled = true;
SecurityLogSettings = new IndexSettings();
}
}

194
aspnet-core/framework/auditing/LINGYUN.Abp.AuditLogging.Elasticsearch/LINGYUN/Abp/AuditLogging/Elasticsearch/ElasticsearchAuditLogManager.cs

@ -1,14 +1,17 @@
using LINGYUN.Abp.Elasticsearch;
using Elastic.Clients.Elasticsearch;
using Elastic.Clients.Elasticsearch.QueryDsl;
using LINGYUN.Abp.Elasticsearch;
using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Logging.Abstractions;
using Microsoft.Extensions.Options;
using Nest;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using Volo.Abp;
using Volo.Abp.Auditing;
using Volo.Abp.DependencyInjection;
using Volo.Abp.Timing;
@ -20,6 +23,7 @@ public class ElasticsearchAuditLogManager : IAuditLogManager, ITransientDependen
{
private readonly AbpAuditingOptions _auditingOptions;
private readonly AbpElasticsearchOptions _elasticsearchOptions;
private readonly AbpAuditLoggingElasticsearchOptions _loggingEsOptions;
private readonly IIndexNameNormalizer _indexNameNormalizer;
private readonly IElasticsearchClientFactory _clientFactory;
private readonly IAuditLogInfoToAuditLogConverter _converter;
@ -33,7 +37,8 @@ public class ElasticsearchAuditLogManager : IAuditLogManager, ITransientDependen
IOptions<AbpElasticsearchOptions> elasticsearchOptions,
IElasticsearchClientFactory clientFactory,
IOptions<AbpAuditingOptions> auditingOptions,
IAuditLogInfoToAuditLogConverter converter)
IAuditLogInfoToAuditLogConverter converter,
IOptionsMonitor<AbpAuditLoggingElasticsearchOptions> loggingEsOptions)
{
_clock = clock;
_converter = converter;
@ -41,6 +46,7 @@ public class ElasticsearchAuditLogManager : IAuditLogManager, ITransientDependen
_auditingOptions = auditingOptions.Value;
_elasticsearchOptions = elasticsearchOptions.Value;
_indexNameNormalizer = indexNameNormalizer;
_loggingEsOptions = loggingEsOptions.CurrentValue;
Logger = NullLogger<ElasticsearchAuditLogManager>.Instance;
}
@ -82,8 +88,11 @@ public class ElasticsearchAuditLogManager : IAuditLogManager, ITransientDependen
httpStatusCode);
var response = await client.CountAsync<AuditLog>(dsl =>
dsl.Index(CreateIndex())
.Query(log => log.Bool(b => b.Must(querys.ToArray()))),
dsl.Indices(CreateIndex())
.Query(new BoolQuery
{
Must = querys
}),
cancellationToken);
return response.Count;
@ -113,7 +122,7 @@ public class ElasticsearchAuditLogManager : IAuditLogManager, ITransientDependen
var client = _clientFactory.Create();
var sortOrder = !sorting.IsNullOrWhiteSpace() && sorting.EndsWith("asc", StringComparison.InvariantCultureIgnoreCase)
? SortOrder.Ascending : SortOrder.Descending;
? SortOrder.Asc : SortOrder.Desc;
sorting = !sorting.IsNullOrWhiteSpace()
? sorting.Split()[0]
: nameof(AuditLog.ExecutionTime);
@ -134,31 +143,32 @@ public class ElasticsearchAuditLogManager : IAuditLogManager, ITransientDependen
hasException,
httpStatusCode);
SourceFilterDescriptor<AuditLog> SourceFilter(SourceFilterDescriptor<AuditLog> selector)
var searchResponse = await client.SearchAsync<AuditLog>(dsl =>
{
selector.IncludeAll();
dsl.Indices(CreateIndex())
.Query(new BoolQuery
{
Must = querys
})
.Sort(s => s.Field(new FieldSort(GetField(sorting))
{
Order = sortOrder
}))
.From(skipCount)
.Size(maxResultCount);
// 字段过滤
if (!includeDetails)
{
selector.Excludes(field =>
field.Field(f => f.Actions)
.Field(f => f.Comments)
.Field(f => f.Exceptions)
.Field(f => f.EntityChanges));
dsl.SourceExcludes(
ex => ex.Actions,
ex => ex.Comments,
ex => ex.Exceptions,
ex => ex.EntityChanges);
}
}, cancellationToken);
return selector;
}
var response = await client.SearchAsync<AuditLog>(dsl =>
dsl.Index(CreateIndex())
.Query(log => log.Bool(b => b.Must(querys.ToArray())))
.Source(SourceFilter)
.Sort(log => log.Field(GetField(sorting), sortOrder))
.From(skipCount)
.Size(maxResultCount),
cancellationToken);
return response.Documents.ToList();
return searchResponse.Documents.ToList();
}
public async virtual Task<AuditLog> GetAsync(
@ -169,9 +179,19 @@ public class ElasticsearchAuditLogManager : IAuditLogManager, ITransientDependen
var client = _clientFactory.Create();
var response = await client.GetAsync<AuditLog>(
id,
id.ToString(),
dsl =>
dsl.Index(CreateIndex()),
{
dsl.Index(CreateIndex());
if (!includeDetails)
{
dsl.SourceExcludes(
ex => ex.Actions,
ex => ex.Comments,
ex => ex.Exceptions,
ex => ex.EntityChanges);
}
},
cancellationToken);
return response.Source;
@ -182,9 +202,8 @@ public class ElasticsearchAuditLogManager : IAuditLogManager, ITransientDependen
var client = _clientFactory.Create();
await client.DeleteAsync<AuditLog>(
id,
dsl =>
dsl.Index(CreateIndex()),
id.ToString(),
dsl => dsl.Index(CreateIndex()),
cancellationToken);
}
@ -192,12 +211,13 @@ public class ElasticsearchAuditLogManager : IAuditLogManager, ITransientDependen
{
var client = _clientFactory.Create();
var idValues = ids.Select(id => FieldValue.String(id.ToString())).ToList();
await client.DeleteByQueryAsync<AuditLog>(
x => x.Index(CreateIndex())
x => x.Indices(CreateIndex())
.Query(query =>
query.Terms(terms =>
terms.Field(field => field.Id)
.Terms(ids))),
.Terms(new TermsQueryField(idValues)))),
cancellationToken);
}
@ -205,6 +225,12 @@ public class ElasticsearchAuditLogManager : IAuditLogManager, ITransientDependen
AuditLogInfo auditInfo,
CancellationToken cancellationToken = default)
{
if (!_loggingEsOptions.IsAuditLogEnabled)
{
Logger.LogInformation(auditInfo.ToString());
return "";
}
if (!_auditingOptions.HideErrors)
{
return await SaveLogAsync(auditInfo, cancellationToken);
@ -217,7 +243,7 @@ public class ElasticsearchAuditLogManager : IAuditLogManager, ITransientDependen
catch (Exception ex)
{
Logger.LogWarning("Could not save the audit log object: " + Environment.NewLine + auditInfo.ToString());
Logger.LogException(ex, Microsoft.Extensions.Logging.LogLevel.Error);
Logger.LogException(ex, LogLevel.Error);
}
return "";
}
@ -239,14 +265,38 @@ public class ElasticsearchAuditLogManager : IAuditLogManager, ITransientDependen
// 使用 Bulk 命令传输可能存在参数庞大的日志结构
var response = await client.BulkAsync(
dsl => dsl.Index(CreateIndex())
.Create<AuditLog>(ct =>
ct.Id(auditLog.Id)
.Document(auditLog)));
.Create(auditLog, ct => ct.Id(auditLog.Id)));
if (!response.IsValidResponse)
{
if (response.TryGetOriginalException(out var ex))
{
throw ex;
}
else if (response.ElasticsearchServerError != null)
{
throw new AbpException(response.ElasticsearchServerError.ToString());
}
else if (response.ItemsWithErrors.Any())
{
var reasonBuilder = new StringBuilder();
foreach (var itemError in response.ItemsWithErrors)
{
if (itemError.Error?.Reason.IsNullOrWhiteSpace() == false)
{
reasonBuilder.AppendLine(itemError.Error.Reason);
}
}
if (reasonBuilder.Length > 0)
{
throw new AbpException(reasonBuilder.ToString());
}
}
}
return response.Items?.FirstOrDefault()?.Id;
}
protected virtual List<Func<QueryContainerDescriptor<AuditLog>, QueryContainer>> BuildQueryDescriptor(
protected virtual List<Query> BuildQueryDescriptor(
DateTime? startTime = null,
DateTime? endTime = null,
string httpMethod = null,
@ -262,55 +312,70 @@ public class ElasticsearchAuditLogManager : IAuditLogManager, ITransientDependen
bool? hasException = null,
HttpStatusCode? httpStatusCode = null)
{
var querys = new List<Func<QueryContainerDescriptor<AuditLog>, QueryContainer>>();
var queries = new List<Query>();
if (startTime.HasValue)
{
querys.Add((log) => log.DateRange((q) => q.Field(GetField(nameof(AuditLog.ExecutionTime))).GreaterThanOrEquals(_clock.Normalize(startTime.Value))));
queries.Add(new DateRangeQuery(GetField(nameof(AuditLog.ExecutionTime)))
{
Gte = _clock.Normalize(startTime.Value)
});
}
if (endTime.HasValue)
{
querys.Add((log) => log.DateRange((q) => q.Field(GetField(nameof(AuditLog.ExecutionTime))).LessThanOrEquals(_clock.Normalize(endTime.Value))));
queries.Add(new DateRangeQuery(GetField(nameof(AuditLog.ExecutionTime)))
{
Lte = _clock.Normalize(endTime.Value)
});
}
if (!httpMethod.IsNullOrWhiteSpace())
{
querys.Add((log) => log.Term((q) => q.Field(GetField(nameof(AuditLog.HttpMethod))).Value(httpMethod)));
queries.Add(new TermQuery(GetField(nameof(AuditLog.HttpMethod)), httpMethod));
}
if (!url.IsNullOrWhiteSpace())
{
querys.Add((log) => log.Wildcard((q) => q.Field(GetField(nameof(AuditLog.Url))).Value($"*{url}*")));
queries.Add(new WildcardQuery(GetField(nameof(AuditLog.Url)))
{
Value = $"*{url}*"
});
}
if (userId.HasValue)
{
querys.Add((log) => log.Term((q) => q.Field(GetField(nameof(AuditLog.UserId))).Value(userId)));
queries.Add(new TermQuery(GetField(nameof(AuditLog.UserId)), userId.Value.ToString()));
}
if (!userName.IsNullOrWhiteSpace())
{
querys.Add((log) => log.Term((q) => q.Field(GetField(nameof(AuditLog.UserName))).Value(userName)));
queries.Add(new TermQuery(GetField(nameof(AuditLog.UserName)), userName));
}
if (!applicationName.IsNullOrWhiteSpace())
{
querys.Add((log) => log.Term((q) => q.Field(GetField(nameof(AuditLog.ApplicationName))).Value(applicationName)));
queries.Add(new TermQuery(GetField(nameof(AuditLog.ApplicationName)), applicationName));
}
if (!correlationId.IsNullOrWhiteSpace())
{
querys.Add((log) => log.Term((q) => q.Field(GetField(nameof(AuditLog.CorrelationId))).Value(correlationId)));
queries.Add(new TermQuery(GetField(nameof(AuditLog.CorrelationId)), correlationId));
}
if (!clientId.IsNullOrWhiteSpace())
{
querys.Add((log) => log.Term((q) => q.Field(GetField(nameof(AuditLog.ClientId))).Value(clientId)));
queries.Add(new TermQuery(GetField(nameof(AuditLog.ClientId)), clientId));
}
if (!clientIpAddress.IsNullOrWhiteSpace())
{
querys.Add((log) => log.Term((q) => q.Field(GetField(nameof(AuditLog.ClientIpAddress))).Value(clientIpAddress)));
queries.Add(new TermQuery(GetField(nameof(AuditLog.ClientIpAddress)), clientIpAddress));
}
if (maxExecutionDuration.HasValue)
{
querys.Add((log) => log.Range((q) => q.Field(GetField(nameof(AuditLog.ExecutionDuration))).LessThanOrEquals(maxExecutionDuration)));
queries.Add(new NumberRangeQuery(GetField(nameof(AuditLog.ExecutionDuration)))
{
Lte = maxExecutionDuration.Value
});
}
if (minExecutionDuration.HasValue)
{
querys.Add((log) => log.Range((q) => q.Field(GetField(nameof(AuditLog.ExecutionDuration))).GreaterThanOrEquals(minExecutionDuration)));
queries.Add(new NumberRangeQuery(GetField(nameof(AuditLog.ExecutionDuration)))
{
Gte = minExecutionDuration.Value
});
}
@ -318,33 +383,26 @@ public class ElasticsearchAuditLogManager : IAuditLogManager, ITransientDependen
{
if (hasException.Value)
{
querys.Add(
(q) => q.Bool(
(b) => b.Must(
(m) => m.Exists(
(e) => e.Field((f) => f.Exceptions)))
)
);
queries.Add(new ExistsQuery(GetField("Exceptions")));
}
else
{
querys.Add(
(q) => q.Bool(
(b) => b.MustNot(
(mn) => mn.Exists(
(e) => e.Field(
(f) => f.Exceptions)))
)
);
queries.Add(new BoolQuery
{
MustNot = new List<Query>
{
new ExistsQuery(GetField("Exceptions"))
}
});
}
}
if (httpStatusCode.HasValue)
{
querys.Add((log) => log.Term((q) => q.Field(GetField(nameof(AuditLog.HttpStatusCode))).Value(httpStatusCode)));
queries.Add(new TermQuery(GetField(nameof(AuditLog.HttpStatusCode)), ((int)httpStatusCode.Value).ToString()));
}
return querys;
return queries;
}
protected virtual string CreateIndex()

260
aspnet-core/framework/auditing/LINGYUN.Abp.AuditLogging.Elasticsearch/LINGYUN/Abp/AuditLogging/Elasticsearch/ElasticsearchEntityChangeStore.cs

@ -1,8 +1,9 @@
using LINGYUN.Abp.Elasticsearch;
using Elastic.Clients.Elasticsearch;
using Elastic.Clients.Elasticsearch.QueryDsl;
using LINGYUN.Abp.Elasticsearch;
using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Logging.Abstractions;
using Microsoft.Extensions.Options;
using Nest;
using System;
using System.Collections.Generic;
using System.Linq;
@ -44,31 +45,34 @@ public class ElasticsearchEntityChangeStore : IEntityChangeStore, ITransientDepe
{
var client = _clientFactory.Create();
var sortOrder = SortOrder.Descending;
var sortOrder = SortOrder.Desc;
var querys = BuildQueryDescriptor(entityChangeId: entityChangeId);
static SourceFilterDescriptor<AuditLog> SourceFilter(SourceFilterDescriptor<AuditLog> selector)
var searchResponse = await client.SearchAsync<AuditLog>(dsl =>
{
selector.IncludeAll()
.Excludes(field =>
field.Field(f => f.Actions)
.Field(f => f.Comments)
.Field(f => f.Exceptions));
dsl.Indices(CreateIndex())
.From(0)
.Size(1)
.Query(new BoolQuery
{
Must = querys
});
return selector;
}
dsl.Sort(s => s.Field(new FieldSort(GetField(nameof(EntityChange.ChangeTime)))
{
Order = sortOrder
}));
var response = await client.SearchAsync<AuditLog>(dsl =>
dsl.Index(CreateIndex())
.Query(log => log.Bool(b => b.Must(querys.ToArray())))
.Source(SourceFilter)
.Sort(log => log.Field(GetField(nameof(EntityChange.ChangeTime)), sortOrder))
.From(0)
.Size(1),
cancellationToken);
dsl.SourceIncludes(ix => ix.EntityChanges);
var auditLog = response.Documents.FirstOrDefault();
dsl.SourceExcludes(
ex => ex.Actions,
ex => ex.Comments,
ex => ex.Exceptions);
}, cancellationToken);
var auditLog = searchResponse.Documents.FirstOrDefault();
if (auditLog != null)
{
return auditLog
@ -99,27 +103,25 @@ public class ElasticsearchEntityChangeStore : IEntityChangeStore, ITransientDepe
entityId,
entityTypeFullName);
SourceFilterDescriptor<AuditLog> SourceFilter(SourceFilterDescriptor<AuditLog> selector)
var searchResponse = await client.SearchAsync<AuditLog>(dsl =>
{
return selector
.Includes(field =>
field.Field(f => f.UserName)
.Field(f => f.EntityChanges))
.Excludes(field =>
field.Field(f => f.Actions)
.Field(f => f.Comments)
.Field(f => f.Exceptions));
}
var response = await client.SearchAsync<AuditLog>(dsl =>
dsl.Index(CreateIndex())
.Query(log => log.Bool(b => b.Must(querys.ToArray())))
.Source(SourceFilter)
dsl.Indices(CreateIndex())
.Query(new BoolQuery
{
Must = querys
})
.SourceIncludes(
ix => ix.UserName,
ix => ix.EntityChanges)
.SourceExcludes(
ex => ex.Actions,
ex => ex.Comments,
ex => ex.Exceptions)
.From(0)
.Size(1000),
cancellationToken);
.Size(1000);
}, cancellationToken);
var auditLogs = response.Documents.ToList();
var auditLogs = searchResponse.Documents.ToList();
return auditLogs.Sum(log => log.EntityChanges.Count);
}
@ -143,7 +145,7 @@ public class ElasticsearchEntityChangeStore : IEntityChangeStore, ITransientDepe
var client = _clientFactory.Create();
var sortOrder = !sorting.IsNullOrWhiteSpace() && sorting.EndsWith("asc", StringComparison.InvariantCultureIgnoreCase)
? SortOrder.Ascending : SortOrder.Descending;
? SortOrder.Asc : SortOrder.Desc;
sorting = !sorting.IsNullOrWhiteSpace()
? sorting.Split()[0]
: nameof(EntityChange.ChangeTime);
@ -156,33 +158,28 @@ public class ElasticsearchEntityChangeStore : IEntityChangeStore, ITransientDepe
entityId,
entityTypeFullName);
SourceFilterDescriptor<AuditLog> SourceFilter(SourceFilterDescriptor<AuditLog> selector)
var searchResponse = await client.SearchAsync<AuditLog>(dsl =>
{
selector
.Includes(field =>
field.Field(f => f.UserName)
.Field(f => f.EntityChanges));
dsl.Indices(CreateIndex())
.Query(new BoolQuery
{
Must = querys
})
.SourceIncludes(
ix => ix.UserName,
ix => ix.EntityChanges)
.From(0)
.Size(1000);
if (includeDetails)
{
selector.Includes(field =>
field.Field(f => f.Actions)
.Field(f => f.Comments)
.Field(f => f.Exceptions));
dsl.SourceExcludes(
ex => ex.Actions,
ex => ex.Comments,
ex => ex.Exceptions);
}
}, cancellationToken);
return selector;
}
var response = await client.SearchAsync<AuditLog>(dsl =>
dsl.Index(CreateIndex())
.Query(log => log.Bool(b => b.Must(querys.ToArray())))
.Source(SourceFilter)
.Sort(log => log.Field(GetField(nameof(EntityChange.ChangeTime)), sortOrder))
.From(0)
.Size(1000),
cancellationToken);
var auditLogs = response.Documents.ToList();
var auditLogs = searchResponse.Documents.ToList();
if (auditLogs.Any())
{
var groupAuditLogs = auditLogs.GroupBy(log => log.UserName);
@ -213,31 +210,29 @@ public class ElasticsearchEntityChangeStore : IEntityChangeStore, ITransientDepe
{
var client = _clientFactory.Create();
var sortOrder = SortOrder.Descending;
var sortOrder = SortOrder.Desc;
var querys = BuildQueryDescriptor(entityChangeId: entityChangeId);
static SourceFilterDescriptor<AuditLog> SourceFilter(SourceFilterDescriptor<AuditLog> selector)
var searchResponse = await client.SearchAsync<AuditLog>(dsl =>
{
selector.IncludeAll()
.Excludes(field =>
field.Field(f => f.Actions)
.Field(f => f.Comments)
.Field(f => f.Exceptions));
return selector;
}
var response = await client.SearchAsync<AuditLog>(dsl =>
dsl.Index(CreateIndex())
.Query(log => log.Bool(b => b.Must(querys.ToArray())))
.Source(SourceFilter)
.Sort(log => log.Field(GetField(nameof(EntityChange.ChangeTime)), sortOrder))
dsl.Indices(CreateIndex())
.Query(new BoolQuery
{
Must = querys
})
.SourceExcludes(
ix => ix.UserName,
ix => ix.EntityChanges)
.Sort(s => s.Field(new FieldSort(GetField(nameof(EntityChange.ChangeTime)))
{
Order = sortOrder
}))
.From(0)
.Size(1),
cancellationToken);
.Size(1);
}, cancellationToken);
var auditLog = response.Documents.FirstOrDefault();
var auditLog = searchResponse.Documents.FirstOrDefault();
if (auditLog != null)
{
return auditLog.EntityChanges.Select(e =>
@ -260,31 +255,30 @@ public class ElasticsearchEntityChangeStore : IEntityChangeStore, ITransientDepe
var result = new List<EntityChangeWithUsername>();
var client = _clientFactory.Create();
var sortOrder = SortOrder.Descending;
var sortOrder = SortOrder.Desc;
var querys = BuildQueryDescriptor(entityId: entityId, entityTypeFullName: entityTypeFullName);
static SourceFilterDescriptor<AuditLog> SourceFilter(SourceFilterDescriptor<AuditLog> selector)
var searchResponse = await client.SearchAsync<AuditLog>(dsl =>
{
selector.IncludeAll()
.Excludes(field =>
field.Field(f => f.Actions)
.Field(f => f.Comments)
.Field(f => f.Exceptions));
return selector;
}
var response = await client.SearchAsync<AuditLog>(dsl =>
dsl.Index(CreateIndex())
.Query(log => log.Bool(b => b.Must(querys.ToArray())))
.Source(SourceFilter)
.Sort(log => log.Field(GetField(nameof(EntityChange.ChangeTime)), sortOrder))
dsl.Indices(CreateIndex())
.Query(new BoolQuery
{
Must = querys
})
.SourceExcludes(
ix => ix.Actions,
ix => ix.Comments,
ix => ix.Exceptions)
.Sort(s => s.Field(new FieldSort(GetField(nameof(EntityChange.ChangeTime)))
{
Order = sortOrder
}))
.From(0)
.Size(100),
cancellationToken);
.Size(1);
}, cancellationToken);
var auditLogs = response.Documents.ToList();
var auditLogs = searchResponse.Documents.ToList();
if (auditLogs.Any())
{
var groupAuditLogs = auditLogs.GroupBy(log => log.UserName);
@ -310,7 +304,7 @@ public class ElasticsearchEntityChangeStore : IEntityChangeStore, ITransientDepe
return result;
}
protected virtual List<Func<QueryContainerDescriptor<AuditLog>, QueryContainer>> BuildQueryDescriptor(
protected virtual List<Query> BuildQueryDescriptor(
Guid? auditLogId = null,
DateTime? startTime = null,
DateTime? endTime = null,
@ -319,38 +313,47 @@ public class ElasticsearchEntityChangeStore : IEntityChangeStore, ITransientDepe
string entityTypeFullName = null,
Guid? entityChangeId = null)
{
var querys = new List<Func<QueryContainerDescriptor<AuditLog>, QueryContainer>>();
var queries = new List<Query>();
if (auditLogId.HasValue)
{
querys.Add(entity => entity.Term(q => q.Field(GetField(nameof(EntityChange.AuditLogId))).Value(auditLogId)));
queries.Add(new TermQuery(GetField(nameof(EntityChange.AuditLogId)), auditLogId.Value.ToString()));
}
if (startTime.HasValue)
{
querys.Add(entity => entity.DateRange(q => q.Field(GetField(nameof(EntityChange.ChangeTime))).GreaterThanOrEquals(_clock.Normalize(startTime.Value))));
queries.Add(new DateRangeQuery(GetField(nameof(EntityChange.ChangeTime)))
{
Gte = _clock.Normalize(startTime.Value)
});
}
if (endTime.HasValue)
{
querys.Add(entity => entity.DateRange(q => q.Field(GetField(nameof(EntityChange.ChangeTime))).LessThanOrEquals(_clock.Normalize(endTime.Value))));
queries.Add(new DateRangeQuery(GetField(nameof(EntityChange.ChangeTime)))
{
Lte = _clock.Normalize(endTime.Value)
});
}
if (changeType.HasValue)
{
querys.Add(entity => entity.Term(q => q.Field(GetField(nameof(EntityChange.ChangeType))).Value(changeType)));
queries.Add(new TermQuery(GetField(nameof(EntityChange.ChangeType)), ((int)changeType.Value).ToString()));
}
if (!entityId.IsNullOrWhiteSpace())
{
querys.Add(entity => entity.Term(q => q.Field(GetField(nameof(EntityChange.EntityId))).Value(entityId)));
queries.Add(new TermQuery(GetField(nameof(EntityChange.EntityId)), entityId));
}
if (!entityTypeFullName.IsNullOrWhiteSpace())
{
querys.Add(entity => entity.Wildcard(q => q.Field(GetField(nameof(EntityChange.EntityTypeFullName))).Value($"*{entityTypeFullName}*")));
queries.Add(new WildcardQuery(GetField(nameof(EntityChange.EntityTypeFullName)))
{
Value = $"*{entityTypeFullName}*"
});
}
if (entityChangeId.HasValue)
{
querys.Add(entity => entity.Term(q => q.Field(GetField(nameof(EntityChange.Id))).Value(entityChangeId)));
queries.Add(new TermQuery(GetField(nameof(EntityChange.Id)), entityChangeId.Value.ToString()));
}
return querys;
return queries;
}
protected virtual string CreateIndex()
@ -358,34 +361,19 @@ public class ElasticsearchEntityChangeStore : IEntityChangeStore, ITransientDepe
return _indexNameNormalizer.NormalizeIndex("audit-log");
}
protected Func<FieldsDescriptor<EntityChange>, IPromise<Fields>> GetEntityChangeSources()
{
return field => field
.Field("EntityChanges.Id")
.Field("EntityChanges.AuditLogId")
.Field("EntityChanges.TenantId")
.Field("EntityChanges.ChangeTime")
.Field("EntityChanges.ChangeType")
.Field("EntityChanges.EntityTenantId")
.Field("EntityChanges.EntityId")
.Field("EntityChanges.EntityTypeFullName")
.Field("EntityChanges.PropertyChanges")
.Field("EntityChanges.ExtraProperties");
}
private readonly static IDictionary<string, string> _fieldMaps = new Dictionary<string, string>(StringComparer.InvariantCultureIgnoreCase)
{
{ "Id", "EntityChanges.Id.keyword" },
{ "AuditLogId", "EntityChanges.AuditLogId.keyword" },
{ "TenantId", "EntityChanges.TenantId.keyword" },
{ "EntityTenantId", "EntityChanges.EntityTenantId.keyword" },
{ "EntityId", "EntityChanges.EntityId.keyword" },
{ "EntityTypeFullName", "EntityChanges.EntityTypeFullName.keyword" },
{ "PropertyChanges", "EntityChanges.PropertyChanges" },
{ "ExtraProperties", "EntityChanges.ExtraProperties" },
{ "ChangeType", "EntityChanges.ChangeType" },
{ "ChangeTime", "EntityChanges.ChangeTime" },
};
{
{ "Id", "EntityChanges.Id.keyword" },
{ "AuditLogId", "EntityChanges.AuditLogId.keyword" },
{ "TenantId", "EntityChanges.TenantId.keyword" },
{ "EntityTenantId", "EntityChanges.EntityTenantId.keyword" },
{ "EntityId", "EntityChanges.EntityId.keyword" },
{ "EntityTypeFullName", "EntityChanges.EntityTypeFullName.keyword" },
{ "PropertyChanges", "EntityChanges.PropertyChanges" },
{ "ExtraProperties", "EntityChanges.ExtraProperties" },
{ "ChangeType", "EntityChanges.ChangeType" },
{ "ChangeTime", "EntityChanges.ChangeTime" },
};
protected virtual string GetField(string field)
{
if (_fieldMaps.TryGetValue(field, out var mapField))

86
aspnet-core/framework/auditing/LINGYUN.Abp.AuditLogging.Elasticsearch/LINGYUN/Abp/AuditLogging/Elasticsearch/ElasticsearchSecurityLogManager.cs

@ -1,8 +1,9 @@
using LINGYUN.Abp.Elasticsearch;
using Elastic.Clients.Elasticsearch;
using Elastic.Clients.Elasticsearch.QueryDsl;
using LINGYUN.Abp.Elasticsearch;
using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Logging.Abstractions;
using Microsoft.Extensions.Options;
using Nest;
using System;
using System.Collections.Generic;
using System.Linq;
@ -20,6 +21,7 @@ public class ElasticsearchSecurityLogManager : ISecurityLogManager, ITransientDe
{
private readonly AbpSecurityLogOptions _securityLogOptions;
private readonly AbpElasticsearchOptions _elasticsearchOptions;
private readonly AbpAuditLoggingElasticsearchOptions _loggingEsOptions;
private readonly IIndexNameNormalizer _indexNameNormalizer;
private readonly IGuidGenerator _guidGenerator;
private readonly IElasticsearchClientFactory _clientFactory;
@ -33,7 +35,8 @@ public class ElasticsearchSecurityLogManager : ISecurityLogManager, ITransientDe
IIndexNameNormalizer indexNameNormalizer,
IOptions<AbpSecurityLogOptions> securityLogOptions,
IOptions<AbpElasticsearchOptions> elasticsearchOptions,
IElasticsearchClientFactory clientFactory)
IElasticsearchClientFactory clientFactory,
IOptionsMonitor<AbpAuditLoggingElasticsearchOptions> loggingEsOptions)
{
_clock = clock;
_guidGenerator = guidGenerator;
@ -41,6 +44,7 @@ public class ElasticsearchSecurityLogManager : ISecurityLogManager, ITransientDe
_indexNameNormalizer = indexNameNormalizer;
_securityLogOptions = securityLogOptions.Value;
_elasticsearchOptions = elasticsearchOptions.Value;
_loggingEsOptions = loggingEsOptions.CurrentValue;
Logger = NullLogger<ElasticsearchSecurityLogManager>.Instance;
}
@ -55,17 +59,37 @@ public class ElasticsearchSecurityLogManager : ISecurityLogManager, ITransientDe
return;
}
if (!_loggingEsOptions.IsSecurityLogEnabled)
{
Logger.LogInformation(securityLogInfo.ToString());
return;
}
var client = _clientFactory.Create();
var securityLog = new SecurityLog(
_guidGenerator.Create(),
securityLogInfo);
await client.IndexAsync(
var response = await client.IndexAsync(
securityLog,
(x) => x.Index(CreateIndex())
.Id(securityLog.Id),
cancellationToken);
if (!response.IsValidResponse)
{
Logger.LogWarning("Could not save the security log object: " + Environment.NewLine + securityLogInfo.ToString());
if (response.TryGetOriginalException(out var ex))
{
Logger.LogWarning(ex, ex.Message);
}
else if (response.ElasticsearchServerError != null)
{
Logger.LogWarning(response.ElasticsearchServerError.ToString());
}
}
}
public async virtual Task<SecurityLog> GetAsync(
@ -99,12 +123,13 @@ public class ElasticsearchSecurityLogManager : ISecurityLogManager, ITransientDe
{
var client = _clientFactory.Create();
var idValues = ids.Select(x => FieldValue.String(x.ToString())).ToList();
await client.DeleteByQueryAsync<SecurityLog>(
x => x.Index(CreateIndex())
x => x.Indices(CreateIndex())
.Query(query =>
query.Terms(terms =>
terms.Field(field => field.Id)
.Terms(ids))),
.Terms(new TermsQueryField(idValues)))),
cancellationToken);
}
@ -128,7 +153,7 @@ public class ElasticsearchSecurityLogManager : ISecurityLogManager, ITransientDe
var client = _clientFactory.Create();
var sortOrder = !sorting.IsNullOrWhiteSpace() && sorting.EndsWith("asc", StringComparison.InvariantCultureIgnoreCase)
? SortOrder.Ascending : SortOrder.Descending;
? SortOrder.Asc : SortOrder.Desc;
sorting = !sorting.IsNullOrWhiteSpace()
? sorting.Split()[0]
: nameof(SecurityLog.CreationTime);
@ -146,9 +171,11 @@ public class ElasticsearchSecurityLogManager : ISecurityLogManager, ITransientDe
correlationId);
var response = await client.SearchAsync<SecurityLog>(dsl =>
dsl.Index(CreateIndex())
.Query(log => log.Bool(b => b.Must(querys.ToArray())))
.Source(log => log.IncludeAll())
dsl.Indices(CreateIndex())
.Query(new BoolQuery
{
Must = querys
})
.Sort(log => log.Field(GetField(sorting), sortOrder))
.From(skipCount)
.Size(maxResultCount),
@ -186,14 +213,17 @@ public class ElasticsearchSecurityLogManager : ISecurityLogManager, ITransientDe
correlationId);
var response = await client.CountAsync<SecurityLog>(dsl =>
dsl.Index(CreateIndex())
.Query(log => log.Bool(b => b.Must(querys.ToArray()))),
dsl.Indices(CreateIndex())
.Query(new BoolQuery
{
Must = querys
}),
cancellationToken);
return response.Count;
}
protected virtual List<Func<QueryContainerDescriptor<SecurityLog>, QueryContainer>> BuildQueryDescriptor(
protected virtual List<Query> BuildQueryDescriptor(
DateTime? startTime = null,
DateTime? endTime = null,
string applicationName = null,
@ -205,50 +235,56 @@ public class ElasticsearchSecurityLogManager : ISecurityLogManager, ITransientDe
string clientIpAddress = null,
string correlationId = null)
{
var querys = new List<Func<QueryContainerDescriptor<SecurityLog>, QueryContainer>>();
var queries = new List<Query>();
if (startTime.HasValue)
{
querys.Add((log) => log.DateRange((q) => q.Field(GetField(nameof(SecurityLog.CreationTime))).GreaterThanOrEquals(_clock.Normalize(startTime.Value))));
queries.Add(new DateRangeQuery(GetField(nameof(SecurityLog.CreationTime)))
{
Gte = _clock.Normalize(startTime.Value)
});
}
if (endTime.HasValue)
{
querys.Add((log) => log.DateRange((q) => q.Field(GetField(nameof(SecurityLog.CreationTime))).LessThanOrEquals(_clock.Normalize(endTime.Value))));
queries.Add(new DateRangeQuery(GetField(nameof(SecurityLog.CreationTime)))
{
Lte = _clock.Normalize(endTime.Value)
});
}
if (!applicationName.IsNullOrWhiteSpace())
{
querys.Add((log) => log.Term((q) => q.Field(GetField(nameof(SecurityLog.ApplicationName))).Value(applicationName)));
queries.Add(new TermQuery(GetField(nameof(SecurityLog.ApplicationName)), applicationName));
}
if (!identity.IsNullOrWhiteSpace())
{
querys.Add((log) => log.Term((q) => q.Field(GetField(nameof(SecurityLog.Identity))).Value(identity)));
queries.Add(new TermQuery(GetField(nameof(SecurityLog.Identity)), identity));
}
if (!action.IsNullOrWhiteSpace())
{
querys.Add((log) => log.Term((q) => q.Field(GetField(nameof(SecurityLog.Action))).Value(action)));
queries.Add(new TermQuery(GetField(nameof(SecurityLog.Action)), action));
}
if (userId.HasValue)
{
querys.Add((log) => log.Term((q) => q.Field(GetField(nameof(SecurityLog.UserId))).Value(userId)));
queries.Add(new TermQuery(GetField(nameof(SecurityLog.UserId)), userId.Value.ToString()));
}
if (!userName.IsNullOrWhiteSpace())
{
querys.Add((log) => log.Term((q) => q.Field(GetField(nameof(SecurityLog.UserName))).Value(userName)));
queries.Add(new TermQuery(GetField(nameof(SecurityLog.UserName)), userName));
}
if (!clientId.IsNullOrWhiteSpace())
{
querys.Add((log) => log.Term((q) => q.Field(GetField(nameof(SecurityLog.ClientId))).Value(clientId)));
queries.Add(new TermQuery(GetField(nameof(SecurityLog.ClientId)), clientId));
}
if (!clientIpAddress.IsNullOrWhiteSpace())
{
querys.Add((log) => log.Term((q) => q.Field(GetField(nameof(SecurityLog.ClientIpAddress))).Value(clientIpAddress)));
queries.Add(new TermQuery(GetField(nameof(SecurityLog.ClientIpAddress)), clientIpAddress));
}
if (!correlationId.IsNullOrWhiteSpace())
{
querys.Add((log) => log.Term((q) => q.Field(GetField(nameof(SecurityLog.CorrelationId))).Value(correlationId)));
queries.Add(new TermQuery(GetField(nameof(SecurityLog.CorrelationId)), correlationId));
}
return querys;
return queries;
}
protected virtual string CreateIndex()

170
aspnet-core/framework/auditing/LINGYUN.Abp.AuditLogging.Elasticsearch/LINGYUN/Abp/AuditLogging/Elasticsearch/IndexInitializer.cs

@ -1,11 +1,11 @@
using LINGYUN.Abp.Elasticsearch;
using Elastic.Clients.Elasticsearch;
using Elastic.Clients.Elasticsearch.Mapping;
using LINGYUN.Abp.Elasticsearch;
using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Logging.Abstractions;
using Microsoft.Extensions.Options;
using Nest;
using System;
using System.Threading.Tasks;
using Volo.Abp.Data;
using Volo.Abp.DependencyInjection;
using Volo.Abp.Json;
@ -40,66 +40,148 @@ public class IndexInitializer : IIndexInitializer, ISingletonDependency
var dateTimeFormat = !_jsonOptions.OutputDateTimeFormat.IsNullOrWhiteSpace()
? $"{_jsonOptions.OutputDateTimeFormat}||strict_date_optional_time||epoch_millis"
: "strict_date_optional_time||epoch_millis";
var indexState = new IndexState
{
Settings = _elasticsearchOptions.IndexSettings,
};
await InitlizeAuditLogIndex(client, indexState, dateTimeFormat);
await InitlizeSecurityLogIndex(client, indexState, dateTimeFormat);
await InitlizeAuditLogIndex(client, dateTimeFormat);
await InitlizeSecurityLogIndex(client, dateTimeFormat);
}
protected async virtual Task InitlizeAuditLogIndex(IElasticClient client, IIndexState indexState, string dateTimeFormat)
protected async virtual Task InitlizeAuditLogIndex(ElasticsearchClient client, string dateTimeFormat)
{
var indexName = _nameNormalizer.NormalizeIndex("audit-log");
var indexExists = await client.Indices.ExistsAsync(indexName);
if (!indexExists.Exists)
{
var indexCreateResponse = await client.Indices.CreateAsync(
indexName,
dsl => dsl.InitializeUsing(indexState)
.Map<AuditLog>(map =>
map.AutoMap()
.Properties(mp =>
mp.Date(p => p.Name(n => n.ExecutionTime).Format(dateTimeFormat))
.Object<ExtraPropertyDictionary>(p => p.Name(n => n.ExtraProperties))
.Nested<EntityChange>(n =>
n.AutoMap()
.Name(nameof(AuditLog.EntityChanges))
.Properties(np =>
np.Object<ExtraPropertyDictionary>(p => p.Name(n => n.ExtraProperties))
.Date(p => p.Name(n => n.ChangeTime).Format(dateTimeFormat))
.Nested<EntityPropertyChange>(npn => npn.Name(nameof(EntityChange.PropertyChanges)))))
.Nested<AuditLogAction>(n => n.Name(nameof(AuditLog.Actions))
.AutoMap()
.Properties((np =>
np.Object<ExtraPropertyDictionary>(p => p.Name(n => n.ExtraProperties))
.Date(p => p.Name(n => n.ExecutionTime).Format(dateTimeFormat))))))));
if (!indexCreateResponse.IsValid)
var indexCreateResponse = await client.Indices.CreateAsync(indexName, c =>
{
c.Settings(_elasticsearchOptions.AuditLogSettings);
c.Mappings(mp => mp
.Dynamic(DynamicMapping.False)
.Properties<AuditLog>(pd =>
{
pd.Text(k => k.Id, p => p.Fields(f => f.Keyword("keyword", k => k.IgnoreAbove(36))));
pd.Text(t => t.ApplicationName, p => p.Fields(f => f.Keyword("keyword", k => k.IgnoreAbove(64))));
pd.Text(k => k.UserId, p => p.Fields(f => f.Keyword("keyword", k => k.IgnoreAbove(36))));
pd.Text(t => t.UserName, p => p.Fields(f => f.Keyword("keyword", k => k.IgnoreAbove(256))));
pd.Text(k => k.TenantId, p => p.Fields(f => f.Keyword("keyword", k => k.IgnoreAbove(36))));
pd.Text(t => t.TenantName, p => p.Fields(f => f.Keyword("keyword", k => k.IgnoreAbove(64))));
pd.Text(k => k.ImpersonatorUserId, p => p.Fields(f => f.Keyword("keyword", k => k.IgnoreAbove(36))));
pd.Text(t => t.ImpersonatorUserName, p => p.Fields(f => f.Keyword("keyword", k => k.IgnoreAbove(256))));
pd.Text(k => k.ImpersonatorTenantId, p => p.Fields(f => f.Keyword("keyword", k => k.IgnoreAbove(36))));
pd.Text(t => t.ImpersonatorTenantName, p => p.Fields(f => f.Keyword("keyword", k => k.IgnoreAbove(64))));
pd.Date(d => d.ExecutionTime, d => d.Format(dateTimeFormat));
pd.IntegerNumber(n => n.ExecutionDuration);
pd.Text(k => k.ClientIpAddress, p => p.Fields(f => f.Keyword("keyword", k => k.IgnoreAbove(256))));
pd.Text(k => k.ClientName, p => p.Fields(f => f.Keyword("keyword", k => k.IgnoreAbove(256))));
pd.Text(k => k.ClientId, p => p.Fields(f => f.Keyword("keyword", k => k.IgnoreAbove(256))));
pd.Text(k => k.CorrelationId, p => p.Fields(f => f.Keyword("keyword", k => k.IgnoreAbove(64))));
pd.Text(k => k.BrowserInfo, p => p.Fields(f => f.Keyword("keyword", k => k.IgnoreAbove(512))));
pd.Text(k => k.HttpMethod, p => p.Fields(f => f.Keyword("keyword", k => k.IgnoreAbove(36))));
pd.Text(k => k.Url, p => p.Fields(f => f.Keyword("keyword", k => k.IgnoreAbove(1024))));
pd.Text(k => k.Exceptions, p => p.Store(true).Index(false));
pd.Text(k => k.Comments, p => p.Store(true).Index(false));
pd.IntegerNumber(n => n.HttpStatusCode);
pd.Nested(n => n.EntityChanges, np =>
{
np.Dynamic(DynamicMapping.False);
np.Properties(npd =>
{
npd.Text(nameof(EntityChange.Id), p => p.Fields(f => f.Keyword("keyword", k => k.IgnoreAbove(36))));
npd.Text(nameof(EntityChange.AuditLogId), p => p.Fields(f => f.Keyword("keyword", k => k.IgnoreAbove(36))));
npd.Text(nameof(EntityChange.TenantId), p => p.Fields(f => f.Keyword("keyword", k => k.IgnoreAbove(36))));
npd.Date(nameof(EntityChange.ChangeTime), d => d.Format(dateTimeFormat));
npd.ByteNumber(nameof(EntityChange.ChangeType));
npd.Text(nameof(EntityChange.EntityTenantId), p => p.Fields(f => f.Keyword("keyword", k => k.IgnoreAbove(36))));
npd.Text(nameof(EntityChange.EntityId), p => p.Fields(f => f.Keyword("keyword", k => k.IgnoreAbove(128))));
npd.Text(nameof(EntityChange.EntityTypeFullName), p => p.Fields(f => f.Keyword("keyword", k => k.IgnoreAbove(256))));
npd.Nested(nameof(EntityChange.PropertyChanges), pc =>
{
pc.Dynamic(DynamicMapping.False);
pc.Properties(pcn =>
{
pcn.Text(nameof(EntityPropertyChange.Id), p => p.Fields(f => f.Keyword("keyword", k => k.IgnoreAbove(36))));
pcn.Text(nameof(EntityPropertyChange.TenantId), p => p.Fields(f => f.Keyword("keyword", k => k.IgnoreAbove(36))));
pcn.Text(nameof(EntityPropertyChange.EntityChangeId), p => p.Fields(f => f.Keyword("keyword", k => k.IgnoreAbove(36))));
pcn.Text(nameof(EntityPropertyChange.NewValue), p => p.Fields(f => f.Keyword("keyword", k => k.IgnoreAbove(256))));
pcn.Text(nameof(EntityPropertyChange.OriginalValue), p => p.Fields(f => f.Keyword("keyword", k => k.IgnoreAbove(256))));
pcn.Text(nameof(EntityPropertyChange.PropertyName), p => p.Fields(f => f.Keyword("keyword", k => k.IgnoreAbove(256))));
pcn.Text(nameof(EntityPropertyChange.PropertyTypeFullName), p => p.Fields(f => f.Keyword("keyword", k => k.IgnoreAbove(256))));
});
});
npd.Flattened(nameof(EntityChange.ExtraProperties), f => f.DepthLimit(5).EagerGlobalOrdinals(false));
});
});
pd.Nested(n => n.Actions, np =>
{
np.Dynamic(DynamicMapping.False);
np.Properties(npd =>
{
npd.Text(nameof(AuditLogAction.Id), p => p.Fields(f => f.Keyword("keyword", k => k.IgnoreAbove(36))));
npd.Text(nameof(AuditLogAction.TenantId), p => p.Fields(f => f.Keyword("keyword", k => k.IgnoreAbove(36))));
npd.Text(nameof(AuditLogAction.AuditLogId), p => p.Fields(f => f.Keyword("keyword", k => k.IgnoreAbove(36))));
npd.Text(nameof(AuditLogAction.ServiceName), p => p.Fields(f => f.Keyword("keyword", k => k.IgnoreAbove(256))));
npd.Text(nameof(AuditLogAction.MethodName), p => p.Fields(f => f.Keyword("keyword", k => k.IgnoreAbove(256))));
npd.Text(nameof(AuditLogAction.Parameters), p => p.Store(true).Index(false));
npd.Date(nameof(AuditLogAction.ExecutionTime), d => d.Format(dateTimeFormat));
npd.IntegerNumber(nameof(AuditLogAction.ExecutionDuration));
npd.Flattened(nameof(AuditLogAction.ExtraProperties), f => f.DepthLimit(5).EagerGlobalOrdinals(false));
});
});
pd.Flattened(f => f.ExtraProperties, f => f.DepthLimit(5).EagerGlobalOrdinals(false));
}));
});
if (!indexCreateResponse.IsValidResponse)
{
if (indexCreateResponse.TryGetOriginalException(out var ex))
{
Logger.LogWarning(ex, "Failed to initialize index and audit log may not be retrieved.");
return;
}
Logger.LogWarning("Failed to initialize index and audit log may not be retrieved.");
Logger.LogWarning(indexCreateResponse.OriginalException.ToString());
Logger.LogWarning(indexCreateResponse.DebugInformation);
}
}
}
protected async virtual Task InitlizeSecurityLogIndex(IElasticClient client, IIndexState indexState, string dateTimeFormat)
protected async virtual Task InitlizeSecurityLogIndex(ElasticsearchClient client, string dateTimeFormat)
{
var indexName = _nameNormalizer.NormalizeIndex("security-log");
var indexExists = await client.Indices.ExistsAsync(indexName);
if (!indexExists.Exists)
{
var indexCreateResponse = await client.Indices.CreateAsync(
indexName,
dsl => dsl.InitializeUsing(indexState)
.Map<SecurityLog>(map =>
map.AutoMap()
.Properties(mp =>
mp.Object<ExtraPropertyDictionary>(p => p.Name(n => n.ExtraProperties))
.Date(p => p.Name(n => n.CreationTime).Format(dateTimeFormat)))));
if (!indexCreateResponse.IsValid)
var indexCreateResponse = await client.Indices.CreateAsync(indexName, c =>
{
Logger.LogWarning("Failed to initialize index and security log may not be retrieved.");
Logger.LogWarning(indexCreateResponse.OriginalException.ToString());
c.Settings(_elasticsearchOptions.SecurityLogSettings);
c.Mappings(mp =>
{
mp.Dynamic(DynamicMapping.False);
mp.Properties<SecurityLog>(pd =>
{
pd.Text(k => k.Id, p => p.Fields(f => f.Keyword("keyword", k => k.IgnoreAbove(36))));
pd.Text(k => k.TenantId, p => p.Fields(f => f.Keyword("keyword", k => k.IgnoreAbove(36))));
pd.Text(k => k.ApplicationName, p => p.Fields(f => f.Keyword("keyword", k => k.IgnoreAbove(256))));
pd.Text(k => k.Identity, p => p.Fields(f => f.Keyword("keyword", k => k.IgnoreAbove(256))));
pd.Text(k => k.Action, p => p.Fields(f => f.Keyword("keyword", k => k.IgnoreAbove(256))));
pd.Text(k => k.UserId, p => p.Fields(f => f.Keyword("keyword", k => k.IgnoreAbove(36))));
pd.Text(k => k.UserName, p => p.Fields(f => f.Keyword("keyword", k => k.IgnoreAbove(64))));
pd.Text(k => k.TenantName, p => p.Fields(f => f.Keyword("keyword", k => k.IgnoreAbove(64))));
pd.Text(k => k.ClientId, p => p.Fields(f => f.Keyword("keyword", k => k.IgnoreAbove(256))));
pd.Text(k => k.CorrelationId, p => p.Fields(f => f.Keyword("keyword", k => k.IgnoreAbove(256))));
pd.Text(k => k.ClientIpAddress, p => p.Fields(f => f.Keyword("keyword", k => k.IgnoreAbove(256))));
pd.Text(k => k.BrowserInfo, p => p.Fields(f => f.Keyword("keyword", k => k.IgnoreAbove(512))));
pd.Date(k => k.CreationTime, d => d.Format(dateTimeFormat));
pd.Flattened(f => f.ExtraProperties, f => f.DepthLimit(5).EagerGlobalOrdinals(false));
});
});
});
if (!indexCreateResponse.IsValidResponse)
{
if (indexCreateResponse.TryGetOriginalException(out var ex))
{
Logger.LogWarning(ex, "Failed to initialize index and audit log may not be retrieved.");
return;
}
Logger.LogWarning("Failed to initialize index and audit log may not be retrieved.");
Logger.LogWarning(indexCreateResponse.DebugInformation);
}
}
}

4
aspnet-core/framework/auditing/LINGYUN.Abp.AuditLogging.EntityFrameworkCore/LINGYUN.Abp.AuditLogging.EntityFrameworkCore.csproj

@ -4,7 +4,7 @@
<Import Project="..\..\..\..\common.props" />
<PropertyGroup>
<TargetFramework>net9.0</TargetFramework>
<TargetFramework>net10.0</TargetFramework>
<AssemblyName>LINGYUN.Abp.AuditLogging.EntityFrameworkCore</AssemblyName>
<PackageId>LINGYUN.Abp.AuditLogging.EntityFrameworkCore</PackageId>
<GenerateAssemblyConfigurationAttribute>false</GenerateAssemblyConfigurationAttribute>
@ -14,7 +14,7 @@
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Volo.Abp.AutoMapper" />
<PackageReference Include="Volo.Abp.Mapperly" />
<PackageReference Include="Volo.Abp.Identity.EntityFrameworkCore" />
<PackageReference Include="Volo.Abp.AuditLogging.EntityFrameworkCore" />
</ItemGroup>

11
aspnet-core/framework/auditing/LINGYUN.Abp.AuditLogging.EntityFrameworkCore/LINGYUN/Abp/AuditLogging/EntityFrameworkCore/AbpAuditLoggingEntityFrameworkCoreModule.cs

@ -1,5 +1,5 @@
using Microsoft.Extensions.DependencyInjection;
using Volo.Abp.AutoMapper;
using Volo.Abp.Mapperly;
using Volo.Abp.Modularity;
namespace LINGYUN.Abp.AuditLogging.EntityFrameworkCore;
@ -9,16 +9,11 @@ namespace LINGYUN.Abp.AuditLogging.EntityFrameworkCore;
typeof(Volo.Abp.AuditLogging.EntityFrameworkCore.AbpAuditLoggingEntityFrameworkCoreModule))]
[DependsOn(
typeof(AbpAuditLoggingModule),
typeof(AbpAutoMapperModule))]
typeof(AbpMapperlyModule))]
public class AbpAuditLoggingEntityFrameworkCoreModule : AbpModule
{
public override void ConfigureServices(ServiceConfigurationContext context)
{
context.Services.AddAutoMapperObjectMapper<AbpAuditLoggingEntityFrameworkCoreModule>();
Configure<AbpAutoMapperOptions>(options =>
{
options.AddProfile<AbpAuditingMapperProfile>(validate: true);
});
context.Services.AddMapperlyObjectMapper<AbpAuditLoggingEntityFrameworkCoreModule>();
}
}

58
aspnet-core/framework/auditing/LINGYUN.Abp.AuditLogging.EntityFrameworkCore/LINGYUN/Abp/AuditLogging/EntityFrameworkCore/AbpAuditingEfCoreMappers.cs

@ -0,0 +1,58 @@
using Riok.Mapperly.Abstractions;
using Volo.Abp.Identity;
using Volo.Abp.Mapperly;
using Volo.Abp.ObjectExtending;
using VoloAuditLog = Volo.Abp.AuditLogging.AuditLog;
using VoloAuditLogAction = Volo.Abp.AuditLogging.AuditLogAction;
using VoloEntityChange = Volo.Abp.AuditLogging.EntityChange;
using VoloEntityChangeWithUsername = Volo.Abp.AuditLogging.EntityChangeWithUsername;
using VoloEntityPropertyChange = Volo.Abp.AuditLogging.EntityPropertyChange;
namespace LINGYUN.Abp.AuditLogging.EntityFrameworkCore;
[Mapper(RequiredMappingStrategy = RequiredMappingStrategy.Target)]
[MapExtraProperties(DefinitionChecks = MappingPropertyDefinitionChecks.None)]
public partial class VoloAuditLogActionToAuditLogActionMapper : MapperBase<VoloAuditLogAction, AuditLogAction>
{
public override partial AuditLogAction Map(VoloAuditLogAction source);
public override partial void Map(VoloAuditLogAction source, AuditLogAction destination);
}
[Mapper(RequiredMappingStrategy = RequiredMappingStrategy.Target)]
public partial class VoloEntityPropertyChangeToEntityPropertyChangeMapper : MapperBase<VoloEntityPropertyChange, EntityPropertyChange>
{
public override partial EntityPropertyChange Map(VoloEntityPropertyChange source);
public override partial void Map(VoloEntityPropertyChange source, EntityPropertyChange destination);
}
[Mapper(RequiredMappingStrategy = RequiredMappingStrategy.Target)]
[MapExtraProperties(DefinitionChecks = MappingPropertyDefinitionChecks.None)]
public partial class VoloEntityChangeToEntityChangeMapper : MapperBase<VoloEntityChange, EntityChange>
{
public override partial EntityChange Map(VoloEntityChange source);
public override partial void Map(VoloEntityChange source, EntityChange destination);
}
[Mapper(RequiredMappingStrategy = RequiredMappingStrategy.Target)]
[MapExtraProperties(DefinitionChecks = MappingPropertyDefinitionChecks.None)]
public partial class VoloAuditLogToAuditLogMapper : MapperBase<VoloAuditLog, AuditLog>
{
public override partial AuditLog Map(VoloAuditLog source);
public override partial void Map(VoloAuditLog source, AuditLog destination);
}
[Mapper(RequiredMappingStrategy = RequiredMappingStrategy.Target)]
public partial class VoloEntityChangeWithUsernameToEntityChangeWithUsernameMapper : MapperBase<VoloEntityChangeWithUsername, EntityChangeWithUsername>
{
public override partial EntityChangeWithUsername Map(VoloEntityChangeWithUsername source);
public override partial void Map(VoloEntityChangeWithUsername source, EntityChangeWithUsername destination);
}
[Mapper(RequiredMappingStrategy = RequiredMappingStrategy.Target)]
[MapExtraProperties(DefinitionChecks = MappingPropertyDefinitionChecks.None)]
public partial class IdentitySecurityLogToSecurityLogMapper : MapperBase<IdentitySecurityLog, SecurityLog>
{
public override partial SecurityLog Map(IdentitySecurityLog source);
public override partial void Map(IdentitySecurityLog source, SecurityLog destination);
}

23
aspnet-core/framework/auditing/LINGYUN.Abp.AuditLogging.EntityFrameworkCore/LINGYUN/Abp/AuditLogging/EntityFrameworkCore/AbpAuditingMapperProfile.cs

@ -1,23 +0,0 @@
using AutoMapper;
using Volo.Abp.ObjectExtending;
namespace LINGYUN.Abp.AuditLogging.EntityFrameworkCore;
public class AbpAuditingMapperProfile : Profile
{
public AbpAuditingMapperProfile()
{
CreateMap<Volo.Abp.AuditLogging.AuditLogAction, LINGYUN.Abp.AuditLogging.AuditLogAction>()
.MapExtraProperties(MappingPropertyDefinitionChecks.None);
CreateMap<Volo.Abp.AuditLogging.EntityPropertyChange, LINGYUN.Abp.AuditLogging.EntityPropertyChange>();
CreateMap<Volo.Abp.AuditLogging.EntityChange, LINGYUN.Abp.AuditLogging.EntityChange>()
.MapExtraProperties(MappingPropertyDefinitionChecks.None);
CreateMap<Volo.Abp.AuditLogging.AuditLog, LINGYUN.Abp.AuditLogging.AuditLog>()
.MapExtraProperties(MappingPropertyDefinitionChecks.None);
CreateMap<Volo.Abp.AuditLogging.EntityChangeWithUsername, LINGYUN.Abp.AuditLogging.EntityChangeWithUsername>();
CreateMap<Volo.Abp.Identity.IdentitySecurityLog, LINGYUN.Abp.AuditLogging.SecurityLog>(MemberList.Destination)
.MapExtraProperties(MappingPropertyDefinitionChecks.None);
}
}

6
aspnet-core/framework/auditing/LINGYUN.Abp.AuditLogging.EntityFrameworkCore/LINGYUN/Abp/AuditLogging/EntityFrameworkCore/AuditLogManager.cs

@ -17,7 +17,7 @@ namespace LINGYUN.Abp.AuditLogging.EntityFrameworkCore;
[Dependency(ReplaceServices = true)]
public class AuditLogManager : IAuditLogManager, ITransientDependency
{
protected IObjectMapper ObjectMapper { get; }
protected IObjectMapper<AbpAuditLoggingEntityFrameworkCoreModule> ObjectMapper { get; }
protected IAuditLogRepository AuditLogRepository { get; }
protected IUnitOfWorkManager UnitOfWorkManager { get; }
protected AbpAuditingOptions Options { get; }
@ -26,11 +26,11 @@ public class AuditLogManager : IAuditLogManager, ITransientDependency
public ILogger<AuditLogManager> Logger { protected get; set; }
public AuditLogManager(
IObjectMapper objectMapper,
IAuditLogRepository auditLogRepository,
IUnitOfWorkManager unitOfWorkManager,
IOptions<AbpAuditingOptions> options,
IAuditLogInfoToAuditLogConverter converter)
IAuditLogInfoToAuditLogConverter converter,
IObjectMapper<AbpAuditLoggingEntityFrameworkCoreModule> objectMapper)
{
ObjectMapper = objectMapper;
AuditLogRepository = auditLogRepository;

6
aspnet-core/framework/auditing/LINGYUN.Abp.AuditLogging.EntityFrameworkCore/LINGYUN/Abp/AuditLogging/EntityFrameworkCore/EntityChangeStore.cs

@ -14,14 +14,14 @@ namespace LINGYUN.Abp.AuditLogging.EntityFrameworkCore;
[Dependency(ReplaceServices = true)]
public class EntityChangeStore : IEntityChangeStore, ITransientDependency
{
protected IObjectMapper ObjectMapper { get; }
protected IObjectMapper<AbpAuditLoggingEntityFrameworkCoreModule> ObjectMapper { get; }
protected IAuditLogRepository AuditLogRepository { get; }
public ILogger<EntityChangeStore> Logger { protected get; set; }
public EntityChangeStore(
IObjectMapper objectMapper,
IAuditLogRepository auditLogRepository)
IAuditLogRepository auditLogRepository,
IObjectMapper<AbpAuditLoggingEntityFrameworkCoreModule> objectMapper)
{
ObjectMapper = objectMapper;
AuditLogRepository = auditLogRepository;

5
aspnet-core/framework/auditing/LINGYUN.Abp.AuditLogging.EntityFrameworkCore/LINGYUN/Abp/AuditLogging/EntityFrameworkCore/SecurityLogManager.cs

@ -17,15 +17,14 @@ namespace LINGYUN.Abp.AuditLogging.EntityFrameworkCore;
public class SecurityLogManager : ISecurityLogManager, ITransientDependency
{
public ILogger<SecurityLogManager> Logger { get; set; }
protected IObjectMapper ObjectMapper { get; }
protected IObjectMapper<AbpAuditLoggingEntityFrameworkCoreModule> ObjectMapper { get; }
protected AbpSecurityLogOptions SecurityLogOptions { get; }
protected IIdentitySecurityLogRepository IdentitySecurityLogRepository { get; }
protected IGuidGenerator GuidGenerator { get; }
protected IUnitOfWorkManager UnitOfWorkManager { get; }
public SecurityLogManager(
IObjectMapper objectMapper,
IObjectMapper<AbpAuditLoggingEntityFrameworkCoreModule> objectMapper,
ILogger<SecurityLogManager> logger,
IOptions<AbpSecurityLogOptions> securityLogOptions,
IIdentitySecurityLogRepository identitySecurityLogRepository,

2
aspnet-core/framework/auditing/LINGYUN.Abp.AuditLogging.IP.Location/LINGYUN.Abp.AuditLogging.IP.Location.csproj

@ -4,7 +4,7 @@
<Import Project="..\..\..\..\common.props" />
<PropertyGroup>
<TargetFrameworks>netstandard2.0;netstandard2.1;net8.0;net9.0</TargetFrameworks>
<TargetFrameworks>netstandard2.0;netstandard2.1;net8.0;net9.0;net10.0</TargetFrameworks>
<Nullable>enable</Nullable>
<WarningsAsErrors>Nullable</WarningsAsErrors>
<AssemblyName>LINGYUN.Abp.AuditLogging.IP.Location</AssemblyName>

2
aspnet-core/framework/auditing/LINGYUN.Abp.AuditLogging/LINGYUN.Abp.AuditLogging.csproj

@ -4,7 +4,7 @@
<Import Project="..\..\..\..\common.props" />
<PropertyGroup>
<TargetFrameworks>netstandard2.0;netstandard2.1;net8.0;net9.0</TargetFrameworks>
<TargetFrameworks>netstandard2.0;netstandard2.1;net8.0;net9.0;net10.0</TargetFrameworks>
<Nullable>enable</Nullable>
<WarningsAsErrors>Nullable</WarningsAsErrors>
<AssemblyName>LINGYUN.Abp.AuditLogging</AssemblyName>

2
aspnet-core/framework/auditing/LINGYUN.Abp.AuditLogging/LINGYUN/Abp/AuditLogging/EntityChange.cs

@ -1,6 +1,7 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text.Json.Serialization;
using Volo.Abp.Auditing;
using Volo.Abp.Data;
using Volo.Abp.Guids;
@ -18,6 +19,7 @@ public class EntityChange : IHasExtraProperties
public DateTime ChangeTime { get; set; }
[JsonConverter(typeof(EntityChangeTypeConverter))]
public EntityChangeType ChangeType { get; set; }
public Guid? EntityTenantId { get; set; }

31
aspnet-core/framework/auditing/LINGYUN.Abp.AuditLogging/LINGYUN/Abp/AuditLogging/EntityChangeTypeConverter.cs

@ -0,0 +1,31 @@
using System;
using System.Text.Json;
using System.Text.Json.Serialization;
using Volo.Abp.Auditing;
namespace LINGYUN.Abp.AuditLogging;
public class EntityChangeTypeConverter : JsonConverter<EntityChangeType>
{
public override EntityChangeType Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
{
if (reader.TokenType == JsonTokenType.String)
{
var stringValue = reader.GetString();
if (int.TryParse(stringValue, out var intValue))
{
return (EntityChangeType)Enum.ToObject(typeof(EntityChangeType), intValue);
}
}
else if (reader.TokenType == JsonTokenType.Number)
{
return (EntityChangeType)Enum.ToObject(typeof(EntityChangeType), reader.GetInt32());
}
throw new JsonException($"Unable to convert value to enum {typeof(EntityChangeType).Name}");
}
public override void Write(Utf8JsonWriter writer, EntityChangeType value, JsonSerializerOptions options)
{
writer.WriteStringValue(Convert.ToInt32(value).ToString());
}
}

2
aspnet-core/framework/authentication/LINGYUN.Abp.Authentication.QQ/LINGYUN.Abp.Authentication.QQ.csproj

@ -4,7 +4,7 @@
<Import Project="..\..\..\..\common.props" />
<PropertyGroup>
<TargetFramework>net9.0</TargetFramework>
<TargetFramework>net10.0</TargetFramework>
<AssemblyName>LINGYUN.Abp.Authentication.QQ</AssemblyName>
<PackageId>LINGYUN.Abp.Authentication.QQ</PackageId>
<GenerateAssemblyConfigurationAttribute>false</GenerateAssemblyConfigurationAttribute>

Some files were not shown because too many files changed in this diff

Loading…
Cancel
Save