Browse Source

feat(oauth): Rewrite the user authorize page

- 重写OpenIddict授权同意页,允许用户勾选授权范围
pull/1416/head
colin 4 weeks ago
parent
commit
495d51d6b6
  1. 732
      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. 50
      apps/vben5/packages/@abp/openiddict/src/components/scopes/ScopeModal.vue
  9. 11
      aspnet-core/LINGYUN.MicroService.SingleProject.sln
  10. 3
      aspnet-core/aspire/LINGYUN.Abp.MicroService.AdminService/appsettings.Development.json
  11. 10
      aspnet-core/aspire/LINGYUN.Abp.MicroService.ApiGateway/ApiGatewayModule.cs
  12. 2
      aspnet-core/aspire/LINGYUN.Abp.MicroService.ApiGateway/Program.cs
  13. 6
      aspnet-core/aspire/LINGYUN.Abp.MicroService.ApiGateway/appsettings.Development.json
  14. 95
      aspnet-core/aspire/LINGYUN.Abp.MicroService.ApiGateway/yarp.json
  15. 16
      aspnet-core/aspire/LINGYUN.Abp.MicroService.AuthServer/AuthServerModule.Configure.cs
  16. 10
      aspnet-core/aspire/LINGYUN.Abp.MicroService.AuthServer/appsettings.Development.json
  17. 6
      aspnet-core/aspire/LINGYUN.Abp.MicroService.AuthServer/package.json
  18. 3
      aspnet-core/aspire/LINGYUN.Abp.MicroService.IdentityService/appsettings.Development.json
  19. 3
      aspnet-core/aspire/LINGYUN.Abp.MicroService.LocalizationService/appsettings.Development.json
  20. 3
      aspnet-core/aspire/LINGYUN.Abp.MicroService.MessageService/appsettings.Development.json
  21. 3
      aspnet-core/aspire/LINGYUN.Abp.MicroService.PlatformService/appsettings.Development.json
  22. 7
      aspnet-core/aspire/LINGYUN.Abp.MicroService.TaskService/appsettings.Development.json
  23. 6
      aspnet-core/aspire/LINGYUN.Abp.MicroService.WeChatService/appsettings.Development.json
  24. 3
      aspnet-core/aspire/LINGYUN.Abp.MicroService.WebhookService/appsettings.Development.json
  25. 4
      aspnet-core/aspire/LINGYUN.Abp.MicroService.WorkflowService/appsettings.Development.json
  26. 25
      aspnet-core/modules/account/LINGYUN.Abp.Account.Web.OpenIddict/AbpAccountWebOpenIddictModule.cs
  27. 338
      aspnet-core/modules/account/LINGYUN.Abp.Account.Web.OpenIddict/Controllers/AuthorizeController.cs
  28. 8
      aspnet-core/modules/account/LINGYUN.Abp.Account.Web.OpenIddict/LINGYUN.Abp.Account.Web.OpenIddict.csproj
  29. 6
      aspnet-core/modules/account/LINGYUN.Abp.Account.Web.OpenIddict/Localization/Resources/en.json
  30. 6
      aspnet-core/modules/account/LINGYUN.Abp.Account.Web.OpenIddict/Localization/Resources/zh-Hans.json
  31. 23
      aspnet-core/modules/account/LINGYUN.Abp.Account.Web.OpenIddict/ViewModels/Authorize/AuthorizeViewModel.cs
  32. 90
      aspnet-core/modules/account/LINGYUN.Abp.Account.Web.OpenIddict/Views/Authorize/Authorize.cshtml
  33. 29
      aspnet-core/modules/account/LINGYUN.Abp.Account.Web.OpenIddict/Views/Authorize/Authorize.js
  34. 4
      aspnet-core/modules/account/LINGYUN.Abp.Account.Web.OpenIddict/Views/_ViewImports.cshtml
  35. 1
      aspnet-core/modules/account/LINGYUN.Abp.Account.Web/AbpAccountWebModule.cs
  36. 7
      aspnet-core/modules/account/LINGYUN.Abp.Account.Web/Pages/Account/Login.cshtml
  37. 2
      aspnet-core/services/LY.MicroService.Applications.Single/MicroServiceApplicationsSingleModule.Configure.cs
  38. 3
      aspnet-core/services/LY.MicroService.Applications.Single/appsettings.Development.json

732
Directory.Packages.props

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

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

@ -18,7 +18,8 @@
"invalidUserNameOrPassword": "Invalid username or password!", "invalidUserNameOrPassword": "Invalid username or password!",
"tokenHasExpired": "The token is no longer valid!", "tokenHasExpired": "The token is no longer valid!",
"requiresTwoFactor": "Identity verification is required. Please select a verification method!", "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": { "manage": {

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

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

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

@ -28,7 +28,7 @@ const coreRoutes: RouteRecordRaw[] = [
hideInBreadcrumb: true, hideInBreadcrumb: true,
hideInMenu: true, hideInMenu: true,
hideInTab: true, hideInTab: true,
title: 'Processing login', title: $t('page.auth.processingLogin'),
}, },
name: 'OidcFallback', name: 'OidcFallback',
path: '/signin-callback', 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'; import type { Recordable, UserInfo } from '@vben/types';
@ -45,7 +45,7 @@ export const useAuthStore = defineStore('auth', () => {
await oAuthService.login(); await oAuthService.login();
} }
async function oidcCallback() { async function oidcCallback(onError?: (error: OAuthError) => void) {
try { try {
const user = await oAuthService.handleCallback(); const user = await oAuthService.handleCallback();
return await _loginSuccess({ return await _loginSuccess({
@ -55,6 +55,8 @@ export const useAuthStore = defineStore('auth', () => {
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
expiresIn: user.expires_in!, expiresIn: user.expires_in!,
}); });
} catch (error: any) {
onError && onError(error as OAuthError);
} finally { } finally {
loginLoading.value = false; loginLoading.value = false;
} }

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

@ -1,12 +1,26 @@
<script lang="ts" setup> <script lang="ts" setup>
import { onMounted } from 'vue'; import { onMounted } from 'vue';
import { useOAuthError } from '@abp/account';
import { Modal } from 'ant-design-vue';
import { useAuthStore } from '#/store/auth'; import { useAuthStore } from '#/store/auth';
const { formatError } = useOAuthError();
const authStore = useAuthStore(); const authStore = useAuthStore();
onMounted(async () => { onMounted(async () => {
await authStore.oidcCallback(); await authStore.oidcCallback((error) => {
Modal.warn({
centered: true,
maskClosable: false,
closable: false,
title: formatError(error),
onOk: () => {
authStore.logout();
},
});
});
}); });
</script> </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 { import { $t } from '@vben/locales';
error: string;
error_description?: string;
error_uri?: string;
}
export function useOAuthError() { export function useOAuthError() {
function formatError(error: OAuthError) { function formatError(error: OAuthError) {
@ -22,6 +18,10 @@ export function useOAuthError() {
case 'RequiresTwoFactor': { case 'RequiresTwoFactor': {
return $t('abp.oauth.errors.requiresTwoFactor'); return $t('abp.oauth.errors.requiresTwoFactor');
} }
// 用户拒绝授权
case 'The authorization was denied by the end user.': {
return $t('abp.oauth.errors.accessDenied');
}
// Token已失效 // Token已失效
case 'The token is no longer valid.': case 'The token is no longer valid.':
case 'The user is no longer allowed to sign in.': { case 'The user is no longer allowed to sign in.': {

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

@ -1,20 +1,17 @@
<script setup lang="ts"> <script setup lang="ts">
import type { OpenIdConfiguration } from '@abp/core';
import type { FormInstance } from 'ant-design-vue'; import type { FormInstance } from 'ant-design-vue';
import type { TransferItem } from 'ant-design-vue/es/transfer';
import type { OpenIddictScopeDto } from '../../types/scopes'; import type { OpenIddictScopeDto } from '../../types/scopes';
import type { DisplayNameInfo } from '../display-names/types'; import type { DisplayNameInfo } from '../display-names/types';
import type { PropertyInfo } from '../properties/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 { useVbenModal } from '@vben/common-ui';
import { $t } from '@vben/locales'; 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 { useScopesApi } from '../../api/useScopesApi';
import DisplayNameTable from '../display-names/DisplayNameTable.vue'; import DisplayNameTable from '../display-names/DisplayNameTable.vue';
import PropertyTable from '../properties/PropertyTable.vue'; import PropertyTable from '../properties/PropertyTable.vue';
@ -41,20 +38,8 @@ const defaultModel = {} as OpenIddictScopeDto;
const form = ref<FormInstance>(); const form = ref<FormInstance>();
const formModel = ref<OpenIddictScopeDto>({ ...defaultModel }); const formModel = ref<OpenIddictScopeDto>({ ...defaultModel });
const openIdConfiguration = ref<OpenIdConfiguration>();
const activeTab = ref<TabKeys>('basic'); 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 { cancel, createApi, getApi, updateApi } = useScopesApi();
const [Modal, modalApi] = useVbenModal({ const [Modal, modalApi] = useVbenModal({
class: 'w-1/2', class: 'w-1/2',
@ -91,7 +76,6 @@ const [Modal, modalApi] = useVbenModal({
}); });
try { try {
modalApi.setState({ loading: true }); modalApi.setState({ loading: true });
await onDiscovery();
const { id } = modalApi.getData<OpenIddictScopeDto>(); const { id } = modalApi.getData<OpenIddictScopeDto>();
id && (await onGet(id)); id && (await onGet(id));
} finally { } finally {
@ -108,9 +92,6 @@ async function onGet(id: string) {
title: `${$t('AbpOpenIddict.Scopes')} - ${dto.name}`, title: `${$t('AbpOpenIddict.Scopes')} - ${dto.name}`,
}); });
} }
async function onDiscovery() {
openIdConfiguration.value = await discoveryApi();
}
function onDescriptionChange(displayName: DisplayNameInfo) { function onDescriptionChange(displayName: DisplayNameInfo) {
formModel.value.descriptions ??= {}; formModel.value.descriptions ??= {};
formModel.value.descriptions[displayName.culture] = displayName.displayName; formModel.value.descriptions[displayName.culture] = displayName.displayName;
@ -155,6 +136,16 @@ function onPropDelete(prop: PropertyInfo) {
> >
<Input v-model:value="formModel.name" autocomplete="off" /> <Input v-model:value="formModel.name" autocomplete="off" />
</FormItem> </FormItem>
<FormItem
:label="$t('AbpOpenIddict.DisplayName:Resources')"
name="resources"
>
<Select
allow-clear
v-model:value="formModel.resources"
mode="tags"
/>
</FormItem>
</TabPane> </TabPane>
<!-- 显示名称 --> <!-- 显示名称 -->
<TabPane key="dispalyName" :tab="$t('AbpOpenIddict.DisplayNames')"> <TabPane key="dispalyName" :tab="$t('AbpOpenIddict.DisplayNames')">
@ -184,23 +175,6 @@ function onPropDelete(prop: PropertyInfo) {
@delete="onDescriptionDelete" @delete="onDescriptionDelete"
/> />
</TabPane> </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')"> <TabPane key="props" :tab="$t('AbpOpenIddict.Propertites')">
<PropertyTable <PropertyTable

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

@ -1,6 +1,6 @@
Microsoft Visual Studio Solution File, Format Version 12.00 Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 18 # Visual Studio Version 17
VisualStudioVersion = 18.0.11205.157 VisualStudioVersion = 17.14.36616.10 d17.14
MinimumVisualStudioVersion = 10.0.40219.1 MinimumVisualStudioVersion = 10.0.40219.1
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "modules", "modules", "{0B58AA48-665A-443F-A6A8-751FB9629DAF}" Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "modules", "modules", "{0B58AA48-665A-443F-A6A8-751FB9629DAF}"
EndProject EndProject
@ -496,8 +496,6 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.AspNetCore.Mvc.
EndProject 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}" 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 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}" 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 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}" 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}.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.ActiveCfg = Release|Any CPU
{FDBA1B4A-CC5D-4710-AB8C-FA5A91B91BDE}.Release|Any CPU.Build.0 = 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.ActiveCfg = Debug|Any CPU
{B7F866FF-8C8F-4C7D-9084-E0C206F1F26F}.Debug|Any CPU.Build.0 = 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 {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} {3690518A-D6C3-42CC-AEC2-6D48C6987F68} = {5531E2F2-2FC2-45A0-93C7-7FC6F6A4F0AD}
{0D34162C-0CE3-4D7B-B19A-4786C616D0B3} = {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} {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} {B7F866FF-8C8F-4C7D-9084-E0C206F1F26F} = {91867618-0D86-4410-91C6-B1166A9ACDF9}
{E957DB2E-589D-4310-9576-92F108A67CE7} = {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} {4DEFD1AB-C8CD-4240-B4C7-1C8EA4286B2A} = {91867618-0D86-4410-91C6-B1166A9ACDF9}

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

@ -51,7 +51,8 @@
}, },
"AuthServer": { "AuthServer": {
"Authority": "http://localhost:44385/", "Authority": "http://localhost:44385/",
"Audience": "lingyun-abp-application", "Audience": "admin-service",
"ValidAudiences": [ "lingyun-abp-application" ],
"MapInboundClaims": false, "MapInboundClaims": false,
"RequireHttpsMetadata": false, "RequireHttpsMetadata": false,
"SwaggerClientId": "vue-oauth-client" "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"], authority: configuration["AuthServer:Authority"],
scopes: new Dictionary<string, string> scopes: new Dictionary<string, string>
{ {
{"Account", "Account API"}, { configuration["AuthServer:Audience"], "Api Gateway 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"},
}, },
options => options =>
{ {

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

@ -103,7 +103,7 @@ try
clusterGroup.Value.Metadata.TryGetValue("SwaggerEndpoint", out var address) && clusterGroup.Value.Metadata.TryGetValue("SwaggerEndpoint", out var address) &&
!address.IsNullOrWhiteSpace()) !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.OAuthClientId(configuration["AuthServer:SwaggerClientId"]);
options.OAuthClientSecret(configuration["AuthServer:SwaggerClientSecret"]); options.OAuthClientSecret(configuration["AuthServer:SwaggerClientSecret"]);

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

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

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

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

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

@ -37,6 +37,9 @@ using System.Linq;
using System.Text.Encodings.Web; using System.Text.Encodings.Web;
using System.Text.Unicode; using System.Text.Unicode;
using Volo.Abp.AspNetCore.Mvc; 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.Auditing;
using Volo.Abp.BlobStoring; using Volo.Abp.BlobStoring;
using Volo.Abp.Caching; using Volo.Abp.Caching;
@ -166,6 +169,15 @@ public partial class AuthServerModule
{ {
options.ExposeIntegrationServices = true; options.ExposeIntegrationServices = true;
}); });
Configure<AbpBundlingOptions>(options =>
{
options.StyleBundles
.Configure(LeptonXLiteThemeBundles.Styles.Global, bundle =>
{
bundle.AddFiles("/css/global-styles.css");
});
});
} }
private void ConfigureDataSeeder() private void ConfigureDataSeeder()
@ -392,10 +404,6 @@ public partial class AuthServerModule
options.TokenValidationParameters.IssuerValidator = TokenWildcardIssuerValidator.IssuerValidator; options.TokenValidationParameters.IssuerValidator = TokenWildcardIssuerValidator.IssuerValidator;
} }
}); });
//.AddWeChatWork(options =>
//{
// options.SignInScheme = IdentityConstants.ExternalScheme;
//});
services services
.AddDataProtection() .AddDataProtection()

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

@ -47,7 +47,7 @@
} }
}, },
"ConnectionStrings": { "ConnectionStrings": {
"Default": "Host=127.0.0.1;Database=abp;Username=postgres;Password=123456" "Default": "Host=localhost;Database=abp;Username=postgres;Password=123456"
}, },
"CAP": { "CAP": {
"EventBus": { "EventBus": {
@ -59,7 +59,7 @@
}, },
"PostgreSql": { "PostgreSql": {
"TableNamePrefix": "auth", "TableNamePrefix": "auth",
"ConnectionString": "Host=127.0.0.1;Database=abp;Username=postgres;Password=123456" "ConnectionString": "Host=localhost;Database=abp;Username=postgres;Password=123456"
}, },
"RabbitMQ": { "RabbitMQ": {
"HostName": "localhost", "HostName": "localhost",
@ -88,7 +88,8 @@
}, },
"AuthServer": { "AuthServer": {
"Authority": "http://localhost:44385/", "Authority": "http://localhost:44385/",
"Audience": "lingyun-abp-application", "Audience": "auth-server",
"ValidAudiences": [ "lingyun-abp-application" ],
"MapInboundClaims": false, "MapInboundClaims": false,
"RequireHttpsMetadata": false "RequireHttpsMetadata": false
}, },
@ -97,7 +98,7 @@
"VueAdmin": { "VueAdmin": {
"ClientId": "vue-admin-client", "ClientId": "vue-admin-client",
"ClientSecret": "1q2w3e*", "ClientSecret": "1q2w3e*",
"RootUrl": "http://localhost:5666/" "RootUrls": ["http://localhost:5666"]
}, },
"InternalService": { "InternalService": {
"ClientId": "InternalServiceClient", "ClientId": "InternalServiceClient",
@ -107,6 +108,7 @@
"ClientId": "vue-oauth-client", "ClientId": "vue-oauth-client",
"RootUrls": [ "RootUrls": [
"http://localhost:5666", "http://localhost:5666",
"http://localhost:30000",
"http://localhost:30010", "http://localhost:30010",
"http://localhost:30015", "http://localhost:30015",
"http://localhost:30020", "http://localhost:30020",

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", "name": "my-app-authserver",
"private": true, "private": true,
"dependencies": { "dependencies": {
"@abp/aspnetcore.mvc.ui.theme.leptonxlite": "4.3.6", "@abp/aspnetcore.mvc.ui.theme.leptonxlite": "5.0.2",
"@abp/qrcode": "9.3.6" "@abp/qrcode": "10.0.2"
} }
} }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

25
aspnet-core/modules/account/LINGYUN.Abp.Account.Web.OpenIddict/AbpAccountWebOpenIddictModule.cs

@ -1,5 +1,11 @@
using Microsoft.Extensions.DependencyInjection; using LINGYUN.Abp.Account.Web.OpenIddict.ViewModels.Authorize;
using Microsoft.AspNetCore.Mvc.Razor;
using Microsoft.AspNetCore.Mvc.RazorPages;
using Microsoft.Extensions.DependencyInjection;
using Volo.Abp.AspNetCore.Mvc.UI.Bundling;
using Volo.Abp.Localization;
using Volo.Abp.Modularity; using Volo.Abp.Modularity;
using Volo.Abp.OpenIddict.Localization;
using Volo.Abp.VirtualFileSystem; using Volo.Abp.VirtualFileSystem;
using VoloAbpAccountWebOpenIddictModule = Volo.Abp.Account.Web.AbpAccountWebOpenIddictModule; using VoloAbpAccountWebOpenIddictModule = Volo.Abp.Account.Web.AbpAccountWebOpenIddictModule;
@ -24,5 +30,22 @@ public class AbpAccountWebOpenIddictModule : AbpModule
{ {
options.FileSets.AddEmbedded<AbpAccountWebOpenIddictModule>(); options.FileSets.AddEmbedded<AbpAccountWebOpenIddictModule>();
}); });
Configure<RazorViewEngineOptions>(options =>
{
options.ViewLocationFormats.Add("/Views/{1}/{0}.cshtml");
});
Configure<RazorPagesOptions>(options =>
{
options.Conventions.AuthorizePage("/Authorize");
});
Configure<AbpLocalizationOptions>(options =>
{
options.Resources
.Get<AbpOpenIddictResource>()
.AddVirtualJson("/Localization/Resources");
});
} }
} }

338
aspnet-core/modules/account/LINGYUN.Abp.Account.Web.OpenIddict/Controllers/AuthorizeController.cs

@ -0,0 +1,338 @@
using LINGYUN.Abp.Account.Web.OpenIddict.ViewModels.Authorize;
using Microsoft.AspNetCore.Authentication;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Identity;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Options;
using OpenIddict.Abstractions;
using OpenIddict.Server.AspNetCore;
using System;
using System.Collections.Generic;
using System.Collections.Immutable;
using System.IdentityModel.Tokens.Jwt;
using System.Linq;
using System.Security.Claims;
using System.Text.Encodings.Web;
using System.Threading.Tasks;
using Volo.Abp.AspNetCore.Security;
using Volo.Abp.DependencyInjection;
using Volo.Abp.OpenIddict;
using Volo.Abp.Security.Claims;
namespace LINGYUN.Abp.Account.Web.OpenIddict.Controllers;
[Dependency(ReplaceServices = true)]
[ExposeServices(typeof(Volo.Abp.OpenIddict.Controllers.AuthorizeController))]
[Route("connect/authorize")]
[ApiExplorerSettings(IgnoreApi = true)]
public class AuthorizeController : Volo.Abp.OpenIddict.Controllers.AuthorizeController
{
[HttpGet, HttpPost]
[IgnoreAntiforgeryToken]
[IgnoreAbpSecurityHeader]
public override async Task<IActionResult> HandleAsync()
{
var request = await GetOpenIddictServerRequestAsync(HttpContext);
// Try to retrieve the user principal stored in the authentication cookie and redirect
// the user agent to the login page (or to an external provider) in the following cases:
//
// - If the user principal can't be extracted or the cookie is too old.
// - If prompt=login was specified by the client application.
// - If max_age=0 was specified by the client application (max_age=0 is equivalent to prompt=login).
// - If a max_age parameter was provided and the authentication cookie is not considered "fresh" enough.
//
// For scenarios where the default authentication handler configured in the ASP.NET Core
// authentication options shouldn't be used, a specific scheme can be specified here.
var result = await HttpContext.AuthenticateAsync(IdentityConstants.ApplicationScheme);
if (result is not { Succeeded: true } ||
((request.HasPromptValue(OpenIddictConstants.PromptValues.Login) || request.MaxAge is 0 ||
(request.MaxAge is not null && result.Properties?.IssuedUtc is not null &&
TimeProvider.System.GetUtcNow() - result.Properties.IssuedUtc > TimeSpan.FromSeconds(request.MaxAge.Value))) &&
TempData["IgnoreAuthenticationChallenge"] is null or false))
{
// If the client application requested promptless authentication,
// return an error indicating that the user is not logged in.
if (request.HasPromptValue(OpenIddictConstants.PromptValues.None))
{
return Forbid(
authenticationSchemes: OpenIddictServerAspNetCoreDefaults.AuthenticationScheme,
properties: new AuthenticationProperties(new Dictionary<string, string>
{
[OpenIddictServerAspNetCoreConstants.Properties.Error] = OpenIddictConstants.Errors.LoginRequired,
[OpenIddictServerAspNetCoreConstants.Properties.ErrorDescription] = "The user is not logged in."
}));
}
// To avoid endless login endpoint -> authorization endpoint redirects, a special temp data entry is
// used to skip the challenge if the user agent has already been redirected to the login endpoint.
//
// Note: this flag doesn't guarantee that the user has accepted to re-authenticate. If such a guarantee
// is needed, the existing authentication cookie MUST be deleted AND revoked (e.g using ASP.NET Core
// Identity's security stamp feature with an extremely short revalidation time span) before triggering
// a challenge to redirect the user agent to the login endpoint.
TempData["IgnoreAuthenticationChallenge"] = true;
// For scenarios where the default challenge handler configured in the ASP.NET Core
// authentication options shouldn't be used, a specific scheme can be specified here.
return Challenge(new AuthenticationProperties
{
RedirectUri = Request.PathBase + Request.Path + QueryString.Create(Request.HasFormContentType ? Request.Form : Request.Query)
});
}
// If prompt=select_account was specified by the client application,
// We will redirect the user to the select_account page.
if (request.HasPromptValue(OpenIddictConstants.PromptValues.SelectAccount) && TempData["IgnoreSelectAccount"] is null or false)
{
// To avoid endless select account endpoint -> authorization endpoint redirects, a special temp data entry is
// used to skip the redirect if the user agent has already been redirected to the select account endpoint.
TempData["IgnoreSelectAccount"] = true;
var selectAccountPath = HttpContext.RequestServices.GetRequiredService<IOptions<AbpOpenIddictAspNetCoreOptions>>().Value.SelectAccountPage.RemovePostFix("/");
return Redirect(Url.Content($"{selectAccountPath}?RedirectUri={UrlEncoder.Default.Encode(Request.PathBase + Request.Path + QueryString.Create(Request.HasFormContentType ? Request.Form : Request.Query))}"));
}
// Retrieve the profile of the logged in user.
var dynamicPrincipal = result.Principal;
if (AbpClaimsPrincipalFactoryOptions.Value.IsDynamicClaimsEnabled)
{
dynamicPrincipal = await AbpClaimsPrincipalFactory.CreateDynamicAsync(dynamicPrincipal);
if (dynamicPrincipal == null)
{
return Challenge(
authenticationSchemes: IdentityConstants.ApplicationScheme,
properties: new AuthenticationProperties
{
RedirectUri = Request.PathBase + Request.Path + QueryString.Create(Request.HasFormContentType ? Request.Form : Request.Query)
});
}
}
var user = await UserManager.GetUserAsync(dynamicPrincipal);
if (user == null)
{
return Challenge(
authenticationSchemes: IdentityConstants.ApplicationScheme,
properties: new AuthenticationProperties
{
RedirectUri = Request.PathBase + Request.Path + QueryString.Create(Request.HasFormContentType ? Request.Form : Request.Query)
});
}
// Retrieve the application details from the database.
var application = await ApplicationManager.FindByClientIdAsync(request.ClientId) ??
throw new InvalidOperationException(L["DetailsConcerningTheCallingClientApplicationCannotBeFound"]);
// Retrieve the permanent authorizations associated with the user and the calling client application.
var authorizations = await AuthorizationManager.FindAsync(
subject: await UserManager.GetUserIdAsync(user),
client: await ApplicationManager.GetIdAsync(application),
status: OpenIddictConstants.Statuses.Valid,
type: OpenIddictConstants.AuthorizationTypes.Permanent,
scopes: request.GetScopes()).ToListAsync();
switch (await ApplicationManager.GetConsentTypeAsync(application))
{
// If the consent is external (e.g when authorizations are granted by a sysadmin),
// immediately return an error if no authorization can be found in the database.
case OpenIddictConstants.ConsentTypes.External when !authorizations.Any():
return Forbid(
authenticationSchemes: OpenIddictServerAspNetCoreDefaults.AuthenticationScheme,
properties: new AuthenticationProperties(new Dictionary<string, string>
{
[OpenIddictServerAspNetCoreConstants.Properties.Error] = OpenIddictConstants.Errors.ConsentRequired,
[OpenIddictServerAspNetCoreConstants.Properties.ErrorDescription] = "The logged in user is not allowed to access this client application."
}));
// If the consent is implicit or if an authorization was found,
// return an authorization response without displaying the consent form.
case OpenIddictConstants.ConsentTypes.Implicit:
case OpenIddictConstants.ConsentTypes.External when authorizations.Any():
case OpenIddictConstants.ConsentTypes.Explicit when authorizations.Any() && !request.HasPromptValue(OpenIddictConstants.PromptValues.Consent):
var principal = await SignInManager.CreateUserPrincipalAsync(user);
var sid = dynamicPrincipal.FindFirst(JwtRegisteredClaimNames.Sid);
if (sid != null)
{
principal.RemoveClaims(JwtRegisteredClaimNames.Sid);
principal.AddClaim(JwtRegisteredClaimNames.Sid, sid.Value);
}
if (result.Properties != null && result.Properties.IsPersistent)
{
var claim = new Claim(AbpClaimTypes.RememberMe, true.ToString()).SetDestinations(OpenIddictConstants.Destinations.AccessToken);
principal.Identities.FirstOrDefault()?.AddClaim(claim);
}
// Note: in this sample, the granted scopes match the requested scope
// but you may want to allow the user to uncheck specific scopes.
// For that, simply restrict the list of scopes before calling SetScopes.
principal.SetScopes(request.GetScopes());
principal.SetResources(await ScopeManager.ListResourcesAsync(principal.GetScopes()).ToListAsync());
// Automatically create a permanent authorization to avoid requiring explicit consent
// for future authorization or token requests containing the same scopes.
var authorization = authorizations.LastOrDefault();
if (authorization == null)
{
authorization = await AuthorizationManager.CreateAsync(
principal: principal,
subject: await UserManager.GetUserIdAsync(user),
client: await ApplicationManager.GetIdAsync(application),
type: OpenIddictConstants.AuthorizationTypes.Permanent,
scopes: principal.GetScopes());
}
principal.SetAuthorizationId(await AuthorizationManager.GetIdAsync(authorization));
await OpenIddictClaimsPrincipalManager.HandleAsync(request, principal);
return SignIn(principal, OpenIddictServerAspNetCoreDefaults.AuthenticationScheme);
// At this point, no authorization was found in the database and an error must be returned
// if the client application specified prompt=none in the authorization request.
case OpenIddictConstants.ConsentTypes.Explicit when request.HasPromptValue(OpenIddictConstants.PromptValues.None):
case OpenIddictConstants.ConsentTypes.Systematic when request.HasPromptValue(OpenIddictConstants.PromptValues.None):
return Forbid(
authenticationSchemes: OpenIddictServerAspNetCoreDefaults.AuthenticationScheme,
properties: new AuthenticationProperties(new Dictionary<string, string>
{
[OpenIddictServerAspNetCoreConstants.Properties.Error] = OpenIddictConstants.Errors.ConsentRequired,
[OpenIddictServerAspNetCoreConstants.Properties.ErrorDescription] = "Interactive user consent is required."
}));
// In every other case, render the consent form.
default:
return View("Authorize", new AuthorizeViewModel
{
ApplicationName = await ApplicationManager.GetLocalizedDisplayNameAsync(application),
AvailableScopes = await BuildScopeListAsync(request.GetScopes()),
Scope = request.Scope,
});
}
}
[HttpPost]
[Authorize]
[Route("callback")]
public override async Task<IActionResult> HandleCallbackAsync()
{
if (await HasFormValueAsync("deny"))
{
// Notify OpenIddict that the authorization grant has been denied by the resource owner
// to redirect the user agent to the client application using the appropriate response_mode.
return Forbid(OpenIddictServerAspNetCoreDefaults.AuthenticationScheme);
}
var request = await GetOpenIddictServerRequestAsync(HttpContext);
// Retrieve the profile of the logged in user.
var user = await UserManager.GetUserAsync(User) ??
throw new InvalidOperationException(L["TheUserDetailsCannotBbeRetrieved"]);
// Retrieve the application details from the database.
var application = await ApplicationManager.FindByClientIdAsync(request.ClientId) ??
throw new InvalidOperationException(L["DetailsConcerningTheCallingClientApplicationCannotBeFound"]);
// Retrieve the permanent authorizations associated with the user and the calling client application.
var authorizations = await AuthorizationManager.FindAsync(
subject: await UserManager.GetUserIdAsync(user),
client: await ApplicationManager.GetIdAsync(application),
status: OpenIddictConstants.Statuses.Valid,
type: OpenIddictConstants.AuthorizationTypes.Permanent,
scopes: request.GetScopes()).ToListAsync();
// Note: the same check is already made in the other action but is repeated
// here to ensure a malicious user can't abuse this POST-only endpoint and
// force it to return a valid response without the external authorization.
if (!authorizations.Any() && await ApplicationManager.HasConsentTypeAsync(application, OpenIddictConstants.ConsentTypes.External))
{
return Forbid(
authenticationSchemes: OpenIddictServerAspNetCoreDefaults.AuthenticationScheme,
properties: new AuthenticationProperties(new Dictionary<string, string>
{
[OpenIddictServerAspNetCoreConstants.Properties.Error] = OpenIddictConstants.Errors.ConsentRequired,
[OpenIddictServerAspNetCoreConstants.Properties.ErrorDescription] = "The logged in user is not allowed to access this client application."
}));
}
var principal = await SignInManager.CreateUserPrincipalAsync(user);
var sid = User.FindFirst(JwtRegisteredClaimNames.Sid);
if (sid != null)
{
principal.RemoveClaims(JwtRegisteredClaimNames.Sid);
principal.AddClaim(JwtRegisteredClaimNames.Sid, sid.Value);
}
var result = await HttpContext.AuthenticateAsync(IdentityConstants.ApplicationScheme);
if (result.Succeeded && result.Properties != null && result.Properties.IsPersistent)
{
var claim = new Claim(AbpClaimTypes.RememberMe, true.ToString()).SetDestinations(OpenIddictConstants.Destinations.AccessToken);
principal.Identities.FirstOrDefault()?.AddClaim(claim);
}
var scopes = Request.Form["selected_scopes"].ToString()?.Split(" ").ToImmutableArray() ?? [];
if (scopes.IsNullOrEmpty())
{
scopes = request.GetScopes();
}
// Note: in this sample, the granted scopes match the requested scope
// but you may want to allow the user to uncheck specific scopes.
// For that, simply restrict the list of scopes before calling SetScopes.
principal.SetScopes(scopes);
principal.SetResources(await ScopeManager.ListResourcesAsync(scopes).ToListAsync());
// Automatically create a permanent authorization to avoid requiring explicit consent
// for future authorization or token requests containing the same scopes.
var authorization = authorizations.LastOrDefault();
if (authorization == null)
{
authorization = await AuthorizationManager.CreateAsync(
principal: principal,
subject: await UserManager.GetUserIdAsync(user),
client: await ApplicationManager.GetIdAsync(application),
type: OpenIddictConstants.AuthorizationTypes.Permanent,
scopes: principal.GetScopes());
}
principal.SetAuthorizationId(await AuthorizationManager.GetIdAsync(authorization));
principal.SetScopes(scopes);
principal.SetResources(await GetResourcesAsync(scopes));
await OpenIddictClaimsPrincipalManager.HandleAsync(request, principal);
// Returning a SignInResult will ask OpenIddict to issue the appropriate access/identity tokens.
return SignIn(principal, OpenIddictServerAspNetCoreDefaults.AuthenticationScheme);
}
private async Task<List<ScopeItemViewModel>> BuildScopeListAsync(ImmutableArray<string> requestedScopes)
{
var scopes = requestedScopes.Select(scopeName =>
new ScopeItemViewModel
{
Value = scopeName,
DisplayName = scopeName,
IsRequired = scopeName == "openid" || scopeName == "offline_access",
})
.OrderByDescending(x => x.IsRequired)
.ToList();
await foreach(var scope in ScopeManager.FindByNamesAsync(requestedScopes))
{
var scopeName = await ScopeManager.GetNameAsync(scope);
var scopeModel = scopes.FirstOrDefault(x => x.Value == scopeName);
if (scopeModel != null)
{
var displayName = await ScopeManager.GetLocalizedDisplayNameAsync(scope);
var description = await ScopeManager.GetLocalizedDescriptionAsync(scope);
scopeModel.DisplayName = displayName;
scopeModel.Description = description;
}
}
return scopes;
}
}

8
aspnet-core/modules/account/LINGYUN.Abp.Account.Web.OpenIddict/LINGYUN.Abp.Account.Web.OpenIddict.csproj

@ -10,11 +10,19 @@
<GenerateAssemblyConfigurationAttribute>false</GenerateAssemblyConfigurationAttribute> <GenerateAssemblyConfigurationAttribute>false</GenerateAssemblyConfigurationAttribute>
<GenerateAssemblyCompanyAttribute>false</GenerateAssemblyCompanyAttribute> <GenerateAssemblyCompanyAttribute>false</GenerateAssemblyCompanyAttribute>
<GenerateAssemblyProductAttribute>false</GenerateAssemblyProductAttribute> <GenerateAssemblyProductAttribute>false</GenerateAssemblyProductAttribute>
<GenerateEmbeddedFilesManifest>true</GenerateEmbeddedFilesManifest>
<RootNamespace>LINGYUN.Abp.Account.Web.OpenIddict</RootNamespace> <RootNamespace>LINGYUN.Abp.Account.Web.OpenIddict</RootNamespace>
<OutputType>Library</OutputType> <OutputType>Library</OutputType>
<IsPackable>true</IsPackable> <IsPackable>true</IsPackable>
</PropertyGroup> </PropertyGroup>
<ItemGroup>
<EmbeddedResource Include="Localization\**\*.json" />
<EmbeddedResource Include="Views\**\*.js" />
<Content Remove="Localization\**\*.json" />
<Content Remove="Views\**\*.js" />
</ItemGroup>
<ItemGroup> <ItemGroup>
<PackageReference Include="Volo.Abp.Account.Web.OpenIddict" /> <PackageReference Include="Volo.Abp.Account.Web.OpenIddict" />
<PackageReference Include="Microsoft.Extensions.FileProviders.Embedded" /> <PackageReference Include="Microsoft.Extensions.FileProviders.Embedded" />

6
aspnet-core/modules/account/LINGYUN.Abp.Account.Web.OpenIddict/Localization/Resources/en.json

@ -0,0 +1,6 @@
{
"culture": "en",
"texts": {
"Required": "Required"
}
}

6
aspnet-core/modules/account/LINGYUN.Abp.Account.Web.OpenIddict/Localization/Resources/zh-Hans.json

@ -0,0 +1,6 @@
{
"culture": "zh-Hans",
"texts": {
"Required": "必须"
}
}

23
aspnet-core/modules/account/LINGYUN.Abp.Account.Web.OpenIddict/ViewModels/Authorize/AuthorizeViewModel.cs

@ -0,0 +1,23 @@
using Microsoft.AspNetCore.Mvc;
using System.Collections.Generic;
namespace LINGYUN.Abp.Account.Web.OpenIddict.ViewModels.Authorize;
public class AuthorizeViewModel
{
public string ApplicationName { get; set; }
[HiddenInput]
public string Scope { get; set; }
public List<ScopeItemViewModel> AvailableScopes { get; set; }
}
public class ScopeItemViewModel
{
public string Value { get; set; }
public string DisplayName { get; set; }
public string Description { get; set; }
public bool IsRequired { get; set; }
public bool IsChecked { get; set; }
}

90
aspnet-core/modules/account/LINGYUN.Abp.Account.Web.OpenIddict/Views/Authorize/Authorize.cshtml

@ -0,0 +1,90 @@
@using Microsoft.Extensions.Primitives
@using Volo.Abp.OpenIddict.Localization
@using Volo.Abp.AspNetCore.Mvc.UI.Layout
@using Volo.Abp.AspNetCore.Mvc.UI.Theming;
@using Microsoft.AspNetCore.Mvc.Localization
@using LINGYUN.Abp.Account.Web.OpenIddict.ViewModels.Authorize
@inject IHtmlLocalizer<AbpOpenIddictResource> L
@inject IThemeManager ThemeManager
@inject IPageLayout PageLayout
@model AuthorizeViewModel
@{
Layout = ThemeManager.CurrentTheme.GetAccountLayout();
PageLayout.Content.Title = L["Authorization"].Value;
}
@section scripts
{
<abp-script-bundle name="@typeof(AuthorizeViewModel).FullName">
<abp-script src="/Views/Authorize/Authorize.js" />
</abp-script-bundle>
}
<abp-card>
<abp-card-body>
<p class="lead text-left"><strong>@string.Format(L["DoYouWantToGrantAccessToYourData"].Value, @Model.ApplicationName)</strong></p>
<p class="fw-light">@L["ScopesRequested"]:</p>
<form method="post" action="~/connect/authorize/callback">
@Html.AntiForgeryToken()
@foreach (var parameter in Context.Request.HasFormContentType ? (IEnumerable<KeyValuePair<string, StringValues>>)Context.Request.Form : Context.Request.Query)
{
<input type="hidden" name="@parameter.Key" value="@parameter.Value" />
}
<input type="hidden" id="selected_scopes" name="selected_scopes" value="@Model.Scope" />
<div class="mb-4">
<div class="form-check">
@foreach (var scope in Model.AvailableScopes)
{
<div class="list-group-item">
<div class="form-check">
@if (scope.IsRequired)
{
<input class="form-check-input"
type="checkbox"
value="@scope.Value"
id="scope_@scope.Value"
checked
disabled />
<input type="hidden" name="selectedScopeValues" value="@scope.Value" />
}
else
{
<input class="form-check-input scope-checkbox"
type="checkbox"
value="@scope.Value"
id="scope_@scope.Value"
checked
data-scope-value="@scope.Value" />
}
<label class="form-check-label w-100" for="scope_@scope.Value">
<div>
<strong>@scope.DisplayName</strong>
@if (scope.IsRequired)
{
<span class="badge bg-warning ms-2">@L["Required"]</span>
}
</div>
@if (!string.IsNullOrEmpty(scope.Description))
{
<div class="text-muted mt-1">
<small>@scope.Description</small>
</div>
}
</label>
</div>
</div>
}
</div>
</div>
<div class="d-grid gap-2">
<input class="btn btn-primary" name="accept" type="submit" value="@L["Accept"]" />
<input class="btn btn-danger ms-1" name="deny" type="submit" value="@L["Deny"]" />
</div>
</form>
</abp-card-body>
</abp-card>

29
aspnet-core/modules/account/LINGYUN.Abp.Account.Web.OpenIddict/Views/Authorize/Authorize.js

@ -0,0 +1,29 @@
$(function () {
// 初始化选择的 Scope
updateSelectedScopes();
// 监听 Scope 选择变化
$('.scope-checkbox').change(function () {
updateSelectedScopes();
});
function updateSelectedScopes() {
var selected = [];
// 获取必需的 Scope
$('input[name="selectedScopeValues"]').each(function () {
selected.push($(this).val());
});
// 获取用户选择的 Scope
$('.scope-checkbox:checked').each(function () {
var value = $(this).data('scope-value');
if (!selected.includes(value)) {
selected.push(value);
}
});
// 更新隐藏字段
$('#selected_scopes').val(selected.join(' '));
}
});

4
aspnet-core/modules/account/LINGYUN.Abp.Account.Web.OpenIddict/Views/_ViewImports.cshtml

@ -0,0 +1,4 @@
@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers
@addTagHelper *, Volo.Abp.AspNetCore.Mvc.UI
@addTagHelper *, Volo.Abp.AspNetCore.Mvc.UI.Bootstrap
@addTagHelper *, Volo.Abp.AspNetCore.Mvc.UI.Bundling

1
aspnet-core/modules/account/LINGYUN.Abp.Account.Web/AbpAccountWebModule.cs

@ -114,6 +114,7 @@ public class AbpAccountWebModule : AbpModule
{ {
bundle.AddFiles("/client-proxies/account-proxy.js"); bundle.AddFiles("/client-proxies/account-proxy.js");
bundle.AddFiles("/client-proxies/qrcode-proxy.js"); bundle.AddFiles("/client-proxies/qrcode-proxy.js");
bundle.AddFiles("/Pages/Account/Login.js");
bundle.AddContributors(typeof(QRCodeScriptContributor)); bundle.AddContributors(typeof(QRCodeScriptContributor));
}); });
}); });

7
aspnet-core/modules/account/LINGYUN.Abp.Account.Web/Pages/Account/Login.cshtml

@ -18,12 +18,7 @@
PageLayout.Content.Title = L["Login"].Value; PageLayout.Content.Title = L["Login"].Value;
} }
@section scripts <abp-script-bundle name="@typeof(LoginModel).FullName" />
{
<abp-script-bundle name="@typeof(LoginModel).FullName">
<abp-script src="/Pages/Account/Login.js" />
</abp-script-bundle>
}
<div class="account-module-form"> <div class="account-module-form">
@if (Model.EnableLocalLogin) @if (Model.EnableLocalLogin)

2
aspnet-core/services/LY.MicroService.Applications.Single/MicroServiceApplicationsSingleModule.Configure.cs

@ -60,7 +60,7 @@ public partial class MicroServiceApplicationsSingleModule
{ {
builder.AddValidation(options => builder.AddValidation(options =>
{ {
//options.AddAudiences("lingyun-abp-application"); options.AddAudiences("all_in_one");
options.UseLocalServer(); options.UseLocalServer();

3
aspnet-core/services/LY.MicroService.Applications.Single/appsettings.Development.json

@ -107,7 +107,8 @@
"AuthServer": { "AuthServer": {
"UseOpenIddict": true, "UseOpenIddict": true,
"Authority": "http://localhost:30000/", "Authority": "http://localhost:30000/",
"Audience": "lingyun-abp-application", "Audience": "all_in_one",
"ValidAudiences": [ "lingyun-abp-application" ],
"RequireHttpsMetadata": false, "RequireHttpsMetadata": false,
"SwaggerClientId": "vue-oauth-client" "SwaggerClientId": "vue-oauth-client"
}, },

Loading…
Cancel
Save