Browse Source

Merge pull request #1255 from colinin/enhance-swagger-and-cors

feat(open-api): Enhance the swagger configuration
pull/1267/head
yx lin 9 months ago
committed by GitHub
parent
commit
f7febc155f
No known key found for this signature in database GPG Key ID: B5690EEEBB952194
  1. 39
      aspnet-core/migrations/LY.MicroService.Applications.Single.EntityFrameworkCore/DataSeeder/ClientDataSeederContributor.cs
  2. 2
      aspnet-core/services/LY.MicroService.Applications.Single/LY.MicroService.Applications.Single.csproj
  3. 53
      aspnet-core/services/LY.MicroService.Applications.Single/MicroServiceApplicationsSingleModule.Configure.cs
  4. 5
      aspnet-core/services/LY.MicroService.Applications.Single/MicroServiceApplicationsSingleModule.cs
  5. 26
      aspnet-core/services/LY.MicroService.Applications.Single/Program.cs
  6. 12
      aspnet-core/services/LY.MicroService.Applications.Single/appsettings.Development.json
  7. 41
      aspnet-core/services/LY.MicroService.AuthServer.HttpApi.Host/AuthServerHttpApiHostModule.Configure.cs
  8. 13
      aspnet-core/services/LY.MicroService.AuthServer.HttpApi.Host/AuthServerHttpApiHostModule.cs
  9. 2
      aspnet-core/services/LY.MicroService.AuthServer.HttpApi.Host/LY.MicroService.AuthServer.HttpApi.Host.csproj
  10. 5
      aspnet-core/services/LY.MicroService.AuthServer.HttpApi.Host/appsettings.Development.json
  11. 16
      aspnet-core/services/LY.MicroService.AuthServer/AuthServerModule.Configure.cs
  12. 319
      aspnet-core/services/LY.MicroService.AuthServer/DataSeeder/AuthServerDataSeedContributor.cs
  13. 34
      aspnet-core/services/LY.MicroService.AuthServer/appsettings.Development.json
  14. 53
      aspnet-core/services/LY.MicroService.BackendAdmin.HttpApi.Host/BackendAdminHttpApiHostModule.Configure.cs
  15. 12
      aspnet-core/services/LY.MicroService.BackendAdmin.HttpApi.Host/BackendAdminHttpApiHostModule.cs
  16. 6
      aspnet-core/services/LY.MicroService.BackendAdmin.HttpApi.Host/LY.MicroService.BackendAdmin.HttpApi.Host.csproj
  17. 5
      aspnet-core/services/LY.MicroService.BackendAdmin.HttpApi.Host/appsettings.Development.json
  18. 56
      aspnet-core/services/LY.MicroService.IdentityServer.HttpApi.Host/IdentityServerHttpApiHostModule.Configure.cs
  19. 12
      aspnet-core/services/LY.MicroService.IdentityServer.HttpApi.Host/IdentityServerHttpApiHostModule.cs
  20. 2
      aspnet-core/services/LY.MicroService.IdentityServer.HttpApi.Host/LY.MicroService.identityServer.HttpApi.Host.csproj
  21. 5
      aspnet-core/services/LY.MicroService.IdentityServer.HttpApi.Host/appsettings.Development.json
  22. 16
      aspnet-core/services/LY.MicroService.IdentityServer/IdentityServerModule.Configure.cs
  23. 13
      aspnet-core/services/LY.MicroService.IdentityServer/appsettings.Development.json
  24. 6
      aspnet-core/services/LY.MicroService.LocalizationManagement.HttpApi.Host/LY.MicroService.LocalizationManagement.HttpApi.Host.csproj
  25. 41
      aspnet-core/services/LY.MicroService.LocalizationManagement.HttpApi.Host/LocalizationManagementHttpApiHostModule.Configure.cs
  26. 12
      aspnet-core/services/LY.MicroService.LocalizationManagement.HttpApi.Host/LocalizationManagementHttpApiHostModule.cs
  27. 5
      aspnet-core/services/LY.MicroService.LocalizationManagement.HttpApi.Host/appsettings.Development.json
  28. 6
      aspnet-core/services/LY.MicroService.PlatformManagement.HttpApi.Host/LY.MicroService.PlatformManagement.HttpApi.Host.csproj
  29. 41
      aspnet-core/services/LY.MicroService.PlatformManagement.HttpApi.Host/PlatformManagementHttpApiHostModule.Configure.cs
  30. 12
      aspnet-core/services/LY.MicroService.PlatformManagement.HttpApi.Host/PlatformManagementHttpApiHostModule.cs
  31. 5
      aspnet-core/services/LY.MicroService.PlatformManagement.HttpApi.Host/appsettings.Development.json
  32. 6
      aspnet-core/services/LY.MicroService.RealtimeMessage.HttpApi.Host/LY.MicroService.RealtimeMessage.HttpApi.Host.csproj
  33. 41
      aspnet-core/services/LY.MicroService.RealtimeMessage.HttpApi.Host/RealtimeMessageHttpApiHostModule.Configure.cs
  34. 12
      aspnet-core/services/LY.MicroService.RealtimeMessage.HttpApi.Host/RealtimeMessageHttpApiHostModule.cs
  35. 5
      aspnet-core/services/LY.MicroService.RealtimeMessage.HttpApi.Host/appsettings.Development.json
  36. 41
      aspnet-core/services/LY.MicroService.TaskManagement.HttpApi.Host/TaskManagementHttpApiHostModule.Configure.cs
  37. 7
      aspnet-core/services/LY.MicroService.TaskManagement.HttpApi.Host/TaskManagementHttpApiHostModule.cs
  38. 1
      aspnet-core/services/LY.MicroService.TaskManagement.HttpApi.Host/appsettings.Development.json
  39. 41
      aspnet-core/services/LY.MicroService.WebhooksManagement.HttpApi.Host/WebhooksManagementHttpApiHostModule.Configure.cs
  40. 7
      aspnet-core/services/LY.MicroService.WebhooksManagement.HttpApi.Host/WebhooksManagementHttpApiHostModule.cs
  41. 4
      aspnet-core/services/LY.MicroService.WebhooksManagement.HttpApi.Host/appsettings.Development.json
  42. 27
      aspnet-core/services/LY.MicroService.WechatManagement.HttpApi.Host/WechatManagementHttpApiHostModule.Configure.cs
  43. 7
      aspnet-core/services/LY.MicroService.WechatManagement.HttpApi.Host/WechatManagementHttpApiHostModule.cs
  44. 1
      aspnet-core/services/LY.MicroService.WechatManagement.HttpApi.Host/appsettings.Development.json
  45. 53
      aspnet-core/services/LY.MicroService.WorkflowManagement.HttpApi.Host/WorkflowManagementHttpApiHostModule.Configure.cs
  46. 5
      aspnet-core/services/LY.MicroService.WorkflowManagement.HttpApi.Host/WorkflowManagementHttpApiHostModule.cs
  47. 5
      aspnet-core/services/LY.MicroService.WorkflowManagement.HttpApi.Host/appsettings.Development.json
  48. 37
      aspnet-core/templates/micro/content/host/PackageName.CompanyName.ProjectName.HttpApi.Host/ProjectNameHttpApiHostModule.Configure.cs
  49. 5
      aspnet-core/templates/micro/content/host/PackageName.CompanyName.ProjectName.HttpApi.Host/ProjectNameHttpApiHostModule.cs
  50. 5
      aspnet-core/templates/micro/content/host/PackageName.CompanyName.ProjectName.HttpApi.Host/appsettings.Development.json

39
aspnet-core/migrations/LY.MicroService.Applications.Single.EntityFrameworkCore/DataSeeder/ClientDataSeederContributor.cs

@ -1,6 +1,7 @@
using Microsoft.Extensions.Configuration; using Microsoft.Extensions.Configuration;
using OpenIddict.Abstractions; using OpenIddict.Abstractions;
using System; using System;
using System.Collections.Generic;
using System.Globalization; using System.Globalization;
using System.Threading.Tasks; using System.Threading.Tasks;
using Volo.Abp.Authorization.Permissions; using Volo.Abp.Authorization.Permissions;
@ -94,18 +95,18 @@ public class ClientDataSeederContributor : IDataSeedContributor, ITransientDepen
await _applicationManager.CreateAsync(new OpenIddictApplicationDescriptor await _applicationManager.CreateAsync(new OpenIddictApplicationDescriptor
{ {
ClientId = vueClientId, ClientId = vueClientId,
ClientSecret = "1q2w3e*", ClientSecret = configurationSection["VueAdmin:ClientSecret"],
ApplicationType = OpenIddictConstants.ApplicationTypes.Web, ApplicationType = OpenIddictConstants.ApplicationTypes.Web,
ConsentType = OpenIddictConstants.ConsentTypes.Explicit, ConsentType = OpenIddictConstants.ConsentTypes.Explicit,
DisplayName = "Abp Vue Admin Client", DisplayName = "Abp Vue Admin Client",
PostLogoutRedirectUris = PostLogoutRedirectUris =
{ {
new Uri(vueClientRootUrl + "signout-callback-oidc"), new Uri(vueClientRootUrl + "signout-callback"),
new Uri(vueClientRootUrl) new Uri(vueClientRootUrl)
}, },
RedirectUris = RedirectUris =
{ {
new Uri(vueClientRootUrl + "/signin-oidc"), new Uri(vueClientRootUrl + "signin-callback"),
new Uri(vueClientRootUrl) new Uri(vueClientRootUrl)
}, },
Permissions = Permissions =
@ -158,7 +159,7 @@ public class ClientDataSeederContributor : IDataSeedContributor, ITransientDepen
await _applicationManager.CreateAsync(new OpenIddictApplicationDescriptor await _applicationManager.CreateAsync(new OpenIddictApplicationDescriptor
{ {
ClientId = internalServiceClientId, ClientId = internalServiceClientId,
ClientSecret = "1q2w3e*", ClientSecret = configurationSection["InternalService:ClientSecret"],
ClientType = OpenIddictConstants.ClientTypes.Confidential, ClientType = OpenIddictConstants.ClientTypes.Confidential,
ConsentType = OpenIddictConstants.ConsentTypes.Explicit, ConsentType = OpenIddictConstants.ConsentTypes.Explicit,
ApplicationType = OpenIddictConstants.ApplicationTypes.Native, ApplicationType = OpenIddictConstants.ApplicationTypes.Native,
@ -205,30 +206,22 @@ public class ClientDataSeederContributor : IDataSeedContributor, ITransientDepen
} }
} }
var oauthClientId = configurationSection["OAuthClient:ClientId"]; var oauthClientId = configurationSection["VueOAuthClient:ClientId"];
if (!oauthClientId.IsNullOrWhiteSpace()) if (!oauthClientId.IsNullOrWhiteSpace())
{ {
var oauthClientRootUrl = configurationSection["OAuthClient:RootUrl"].EnsureEndsWith('/'); var oauthClientRootUrls = configurationSection.GetSection("VueOAuthClient:RootUrls").Get<List<string>>();
if (await _applicationRepository.FindByClientIdAsync(oauthClientId) == null) if (await _applicationRepository.FindByClientIdAsync(oauthClientId) == null)
{ {
await _applicationManager.CreateAsync(new OpenIddictApplicationDescriptor var application = new OpenIddictApplicationDescriptor
{ {
ClientId = oauthClientId, ClientId = oauthClientId,
ClientSecret = null, ClientSecret = null,
ApplicationType = OpenIddictConstants.ApplicationTypes.Web, ApplicationType = OpenIddictConstants.ApplicationTypes.Web,
ConsentType = OpenIddictConstants.ConsentTypes.Implicit, ConsentType = OpenIddictConstants.ConsentTypes.Implicit,
DisplayName = "OAuth Client", DisplayName = "OAuth Client",
PostLogoutRedirectUris = PostLogoutRedirectUris = { },
{ RedirectUris = { },
new Uri(oauthClientRootUrl + "signout-callback"),
new Uri(oauthClientRootUrl)
},
RedirectUris =
{
new Uri(oauthClientRootUrl + "/signin-callback"),
new Uri(oauthClientRootUrl)
},
Permissions = Permissions =
{ {
OpenIddictConstants.Permissions.Endpoints.Authorization, OpenIddictConstants.Permissions.Endpoints.Authorization,
@ -257,8 +250,20 @@ public class ClientDataSeederContributor : IDataSeedContributor, ITransientDepen
OpenIddictConstants.Permissions.Scopes.Phone, OpenIddictConstants.Permissions.Scopes.Phone,
OpenIddictConstants.Permissions.Prefixes.Scope + scope OpenIddictConstants.Permissions.Prefixes.Scope + scope
} }
};
oauthClientRootUrls.ForEach(url =>
{
application.PostLogoutRedirectUris.AddIfNotContains(new Uri(url.EnsureEndsWith('/')));
application.PostLogoutRedirectUris.AddIfNotContains(new Uri(url.EnsureEndsWith('/') + "signout-callback"));
application.RedirectUris.AddIfNotContains(new Uri(url));
application.RedirectUris.AddIfNotContains(new Uri(url.EnsureEndsWith('/') + "signin-callback"));
application.RedirectUris.AddIfNotContains(new Uri(url.EnsureEndsWith('/') + "swagger/oauth2-redirect.html"));
}); });
await _applicationManager.CreateAsync(application);
var oauthClientPermissions = new string[1] var oauthClientPermissions = new string[1]
{ {
"AbpIdentity.UserLookup" "AbpIdentity.UserLookup"

2
aspnet-core/services/LY.MicroService.Applications.Single/LY.MicroService.Applications.Single.csproj

@ -33,7 +33,6 @@
<PackageReference Include="Serilog.Settings.Configuration" /> <PackageReference Include="Serilog.Settings.Configuration" />
<PackageReference Include="Serilog.Sinks.Elasticsearch" /> <PackageReference Include="Serilog.Sinks.Elasticsearch" />
<PackageReference Include="Serilog.Sinks.File" /> <PackageReference Include="Serilog.Sinks.File" />
<PackageReference Include="Swashbuckle.AspNetCore" />
<PackageReference Include="Quartz.Serialization.Json" /> <PackageReference Include="Quartz.Serialization.Json" />
<PackageReference Include="Volo.Abp.Account.Web.OpenIddict" /> <PackageReference Include="Volo.Abp.Account.Web.OpenIddict" />
<PackageReference Include="Volo.Abp.AspNetCore.Serilog" /> <PackageReference Include="Volo.Abp.AspNetCore.Serilog" />
@ -55,6 +54,7 @@
<PackageReference Include="Volo.Abp.PermissionManagement.Web" /> <PackageReference Include="Volo.Abp.PermissionManagement.Web" />
<PackageReference Include="Volo.Abp.SettingManagement.EntityFrameworkCore" /> <PackageReference Include="Volo.Abp.SettingManagement.EntityFrameworkCore" />
<PackageReference Include="Volo.Abp.SettingManagement.Web" /> <PackageReference Include="Volo.Abp.SettingManagement.Web" />
<PackageReference Include="Volo.Abp.Swashbuckle" />
<PackageReference Include="Volo.Abp.Identity.AspNetCore" /> <PackageReference Include="Volo.Abp.Identity.AspNetCore" />
<PackageReference Include="Volo.Abp.Identity.Web" /> <PackageReference Include="Volo.Abp.Identity.Web" />
<PackageReference Include="Volo.Abp.VirtualFileExplorer.Web" /> <PackageReference Include="Volo.Abp.VirtualFileExplorer.Web" />

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

@ -610,13 +610,32 @@ public partial class MicroServiceApplicationsSingleModule
}); });
} }
private void ConfigureSwagger(IServiceCollection services) private void ConfigureSwagger(IServiceCollection services, IConfiguration configuration)
{ {
// Swagger // Swagger
services.AddSwaggerGen( services.AddAbpSwaggerGenWithOAuth(
configuration["AuthServer:Authority"],
new Dictionary<string, string>
{
{ configuration["AuthServer:Audience"], "Single APP"}
},
options => options =>
{ {
options.SwaggerDoc("v1", new OpenApiInfo { Title = "App API", Version = "v1" }); options.SwaggerDoc("v1", new OpenApiInfo
{
Title = "Single APP API", Version = "v1",
Contact = new OpenApiContact
{
Name = "colin",
Email = "colin.in@foxmail.com",
Url = new Uri("https://github.com/colinin")
},
License = new OpenApiLicense
{
Name = "MIT",
Url = new Uri("https://github.com/colinin/abp-next-admin/blob/master/LICENSE")
}
});
options.DocInclusionPredicate((docName, description) => true); options.DocInclusionPredicate((docName, description) => true);
options.CustomSchemaIds(type => type.FullName); options.CustomSchemaIds(type => type.FullName);
options.AddSecurityDefinition("Bearer", new OpenApiSecurityScheme options.AddSecurityDefinition("Bearer", new OpenApiSecurityScheme
@ -630,13 +649,13 @@ public partial class MicroServiceApplicationsSingleModule
}); });
options.AddSecurityRequirement(new OpenApiSecurityRequirement options.AddSecurityRequirement(new OpenApiSecurityRequirement
{ {
{
new OpenApiSecurityScheme
{ {
new OpenApiSecurityScheme Reference = new OpenApiReference { Type = ReferenceType.SecurityScheme, Id = "Bearer" }
{ },
Reference = new OpenApiReference { Type = ReferenceType.SecurityScheme, Id = "Bearer" } new string[] { }
}, }
new string[] { }
}
}); });
options.OperationFilter<TenantHeaderParamter>(); options.OperationFilter<TenantHeaderParamter>();
}); });
@ -896,12 +915,18 @@ public partial class MicroServiceApplicationsSingleModule
{ {
options.AddDefaultPolicy(builder => options.AddDefaultPolicy(builder =>
{ {
var corsOrigins = configuration.GetSection("App:CorsOrigins").Get<List<string>>();
if (corsOrigins == null || corsOrigins.Count == 0)
{
corsOrigins = configuration["App:CorsOrigins"]?
.Split(",", StringSplitOptions.RemoveEmptyEntries)
.Select(o => o.RemovePostFix("/"))
.ToList() ?? new List<string>();
}
builder builder
.WithOrigins( .WithOrigins(corsOrigins
configuration["App:CorsOrigins"] .Select(o => o.RemovePostFix("/"))
.Split(",", StringSplitOptions.RemoveEmptyEntries) .ToArray()
.Select(o => o.RemovePostFix("/"))
.ToArray()
) )
.WithAbpExposedHeaders() .WithAbpExposedHeaders()
.WithAbpWrapExposedHeaders() .WithAbpWrapExposedHeaders()

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

@ -1,3 +1,5 @@
using Volo.Abp.Swashbuckle;
namespace LY.MicroService.Applications.Single; namespace LY.MicroService.Applications.Single;
[DependsOn( [DependsOn(
@ -370,6 +372,7 @@ namespace LY.MicroService.Applications.Single;
typeof(AbpAspNetCoreMvcWrapperModule), typeof(AbpAspNetCoreMvcWrapperModule),
typeof(AbpAspNetCoreMvcIdempotentWrapperModule), typeof(AbpAspNetCoreMvcIdempotentWrapperModule),
typeof(AbpAspNetCoreHttpOverridesModule), typeof(AbpAspNetCoreHttpOverridesModule),
typeof(AbpSwashbuckleModule),
typeof(AbpMailKitModule), typeof(AbpMailKitModule),
typeof(AbpAutofacModule), typeof(AbpAutofacModule),
@ -418,7 +421,6 @@ public partial class MicroServiceApplicationsSingleModule : AbpModule
ConfigureIdentity(configuration); ConfigureIdentity(configuration);
ConfigureDbContext(configuration); ConfigureDbContext(configuration);
ConfigureAuthServer(configuration); ConfigureAuthServer(configuration);
ConfigureSwagger(context.Services);
ConfigureEndpoints(context.Services); ConfigureEndpoints(context.Services);
ConfigureMultiTenancy(configuration); ConfigureMultiTenancy(configuration);
ConfigureJsonSerializer(configuration); ConfigureJsonSerializer(configuration);
@ -429,6 +431,7 @@ public partial class MicroServiceApplicationsSingleModule : AbpModule
ConfigurePermissionManagement(configuration); ConfigurePermissionManagement(configuration);
ConfigureNotificationManagement(configuration); ConfigureNotificationManagement(configuration);
ConfigureCors(context.Services, configuration); ConfigureCors(context.Services, configuration);
ConfigureSwagger(context.Services, configuration);
ConfigureOssManagement(context.Services, configuration); ConfigureOssManagement(context.Services, configuration);
ConfigureDistributedLock(context.Services, configuration); ConfigureDistributedLock(context.Services, configuration);
ConfigureKestrelServer(configuration, hostingEnvironment); ConfigureKestrelServer(configuration, hostingEnvironment);

26
aspnet-core/services/LY.MicroService.Applications.Single/Program.cs

@ -4,25 +4,6 @@ using Volo.Abp.IO;
using Volo.Abp.Modularity.PlugIns; using Volo.Abp.Modularity.PlugIns;
var builder = WebApplication.CreateBuilder(args); var builder = WebApplication.CreateBuilder(args);
builder.Services.AddCors(options =>
{
options.AddDefaultPolicy(policy =>
{
policy
.WithOrigins(
builder.Configuration["App:CorsOrigins"]
.Split(",", StringSplitOptions.RemoveEmptyEntries)
.Select(o => o.RemovePostFix("/"))
.ToArray()
)
.WithAbpExposedHeaders()
.WithAbpWrapExposedHeaders()
.SetIsOriginAllowedToAllowWildcardSubdomains()
.AllowAnyHeader()
.AllowAnyMethod()
.AllowCredentials();
});
});
builder.Host.AddAppSettingsSecretsJson() builder.Host.AddAppSettingsSecretsJson()
.UseAutofac() .UseAutofac()
.ConfigureAppConfiguration((context, config) => .ConfigureAppConfiguration((context, config) =>
@ -81,9 +62,12 @@ app.UseAbpSession();
app.UseDynamicClaims(); app.UseDynamicClaims();
app.UseAuthorization(); app.UseAuthorization();
app.UseSwagger(); app.UseSwagger();
app.UseSwaggerUI(options => app.UseAbpSwaggerUI(options =>
{ {
options.SwaggerEndpoint("/swagger/v1/swagger.json", "Support App API"); options.SwaggerEndpoint("/swagger/v1/swagger.json", "Support Single APP API");
options.OAuthClientId(app.Configuration["AuthServer:SwaggerClientId"]);
options.OAuthScopes(app.Configuration["AuthServer:Audience"]);
}); });
app.UseAuditing(); app.UseAuditing();
app.UseAbpSerilogEnrichers(); app.UseAbpSerilogEnrichers();

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

@ -2,7 +2,7 @@
"App": { "App": {
"ShowPii": true, "ShowPii": true,
"SelfUrl": "http://127.0.0.1:30001/", "SelfUrl": "http://127.0.0.1:30001/",
"CorsOrigins": "http://127.0.0.1:3100,http://localhost:5666,http://127.0.0.1:30001", "CorsOrigins": [ "http://127.0.0.1:5666", "http://127.0.0.1:30001" ],
"Urls": { "Urls": {
"Applications": { "Applications": {
"MVC": { "MVC": {
@ -149,8 +149,7 @@
"Authority": "http://127.0.0.1:30001/", "Authority": "http://127.0.0.1:30001/",
"Audience": "lingyun-abp-application", "Audience": "lingyun-abp-application",
"RequireHttpsMetadata": false, "RequireHttpsMetadata": false,
"SwaggerClientId": "InternalServiceClient", "SwaggerClientId": "vue-oauth-client"
"SwaggerClientSecret": "1q2w3E*"
}, },
"IdentityServer": { "IdentityServer": {
"Clients": { "Clients": {
@ -172,9 +171,12 @@
"InternalService": { "InternalService": {
"ClientId": "InternalServiceClient" "ClientId": "InternalServiceClient"
}, },
"OAuthClient": { "VueOAuthClient": {
"ClientId": "vue-oauth-client", "ClientId": "vue-oauth-client",
"RootUrl": "http://localhost:5666" "RootUrls": [
"http://127.0.0.1:5666",
"http://127.0.0.1:30001"
]
} }
}, },
"Lifetime": { "Lifetime": {

41
aspnet-core/services/LY.MicroService.AuthServer.HttpApi.Host/AuthServerHttpApiHostModule.Configure.cs

@ -364,13 +364,32 @@ public partial class AuthServerHttpApiHostModule
}); });
} }
private void ConfigureSwagger(IServiceCollection services) private void ConfigureSwagger(IServiceCollection services, IConfiguration configuration)
{ {
// Swagger // Swagger
services.AddSwaggerGen( services.AddAbpSwaggerGenWithOAuth(
configuration["AuthServer:Authority"],
new Dictionary<string, string>
{
{ configuration["AuthServer:Audience"], "Identity Service API"}
},
options => options =>
{ {
options.SwaggerDoc("v1", new OpenApiInfo { Title = "AuthServer API", Version = "v1" }); options.SwaggerDoc("v1", new OpenApiInfo
{
Title = "Identity Service API", Version = "v1",
Contact = new OpenApiContact
{
Name = "colin",
Email = "colin.in@foxmail.com",
Url = new Uri("https://github.com/colinin")
},
License = new OpenApiLicense
{
Name = "MIT",
Url = new Uri("https://github.com/colinin/abp-next-admin/blob/master/LICENSE")
}
});
options.DocInclusionPredicate((docName, description) => true); options.DocInclusionPredicate((docName, description) => true);
options.CustomSchemaIds(type => type.FullName); options.CustomSchemaIds(type => type.FullName);
options.AddSecurityDefinition("Bearer", new OpenApiSecurityScheme options.AddSecurityDefinition("Bearer", new OpenApiSecurityScheme
@ -429,12 +448,18 @@ public partial class AuthServerHttpApiHostModule
{ {
options.AddDefaultPolicy(builder => options.AddDefaultPolicy(builder =>
{ {
var corsOrigins = configuration.GetSection("App:CorsOrigins").Get<List<string>>();
if (corsOrigins == null || corsOrigins.Count == 0)
{
corsOrigins = configuration["App:CorsOrigins"]?
.Split(",", StringSplitOptions.RemoveEmptyEntries)
.Select(o => o.RemovePostFix("/"))
.ToList() ?? new List<string>();
}
builder builder
.WithOrigins( .WithOrigins(corsOrigins
configuration["App:CorsOrigins"] .Select(o => o.RemovePostFix("/"))
.Split(",", StringSplitOptions.RemoveEmptyEntries) .ToArray()
.Select(o => o.RemovePostFix("/"))
.ToArray()
) )
.WithAbpExposedHeaders() .WithAbpExposedHeaders()
.WithAbpWrapExposedHeaders() .WithAbpWrapExposedHeaders()

13
aspnet-core/services/LY.MicroService.AuthServer.HttpApi.Host/AuthServerHttpApiHostModule.cs

@ -38,10 +38,10 @@ using Volo.Abp.EntityFrameworkCore.MySQL;
using Volo.Abp.FeatureManagement.EntityFrameworkCore; using Volo.Abp.FeatureManagement.EntityFrameworkCore;
using Volo.Abp.Http.Client; using Volo.Abp.Http.Client;
using Volo.Abp.Modularity; using Volo.Abp.Modularity;
using Volo.Abp.MultiTenancy;
using Volo.Abp.OpenIddict.EntityFrameworkCore; using Volo.Abp.OpenIddict.EntityFrameworkCore;
using Volo.Abp.PermissionManagement.EntityFrameworkCore; using Volo.Abp.PermissionManagement.EntityFrameworkCore;
using Volo.Abp.SettingManagement.EntityFrameworkCore; using Volo.Abp.SettingManagement.EntityFrameworkCore;
using Volo.Abp.Swashbuckle;
namespace LY.MicroService.AuthServer; namespace LY.MicroService.AuthServer;
@ -86,6 +86,7 @@ namespace LY.MicroService.AuthServer;
typeof(AbpTelemetrySkyWalkingModule), typeof(AbpTelemetrySkyWalkingModule),
typeof(AbpExporterMiniExcelModule), typeof(AbpExporterMiniExcelModule),
typeof(AbpClaimsMappingModule), typeof(AbpClaimsMappingModule),
typeof(AbpSwashbuckleModule),
typeof(AbpAutofacModule) typeof(AbpAutofacModule)
)] )]
public partial class AuthServerHttpApiHostModule : AbpModule public partial class AuthServerHttpApiHostModule : AbpModule
@ -120,11 +121,11 @@ public partial class AuthServerHttpApiHostModule : AbpModule
ConfigureCaching(configuration); ConfigureCaching(configuration);
ConfigureTiming(configuration); ConfigureTiming(configuration);
ConfigureAuditing(configuration); ConfigureAuditing(configuration);
ConfigureSwagger(context.Services);
ConfigureMultiTenancy(configuration); ConfigureMultiTenancy(configuration);
ConfigureJsonSerializer(configuration); ConfigureJsonSerializer(configuration);
ConfigureMvc(context.Services, configuration); ConfigureMvc(context.Services, configuration);
ConfigureCors(context.Services, configuration); ConfigureCors(context.Services, configuration);
ConfigureSwagger(context.Services, configuration);
ConfigureDistributedLocking(context.Services, configuration); ConfigureDistributedLocking(context.Services, configuration);
ConfigureSecurity(context.Services, configuration, hostingEnvironment.IsDevelopment()); ConfigureSecurity(context.Services, configuration, hostingEnvironment.IsDevelopment());
} }
@ -156,9 +157,13 @@ public partial class AuthServerHttpApiHostModule : AbpModule
// Swagger // Swagger
app.UseSwagger(); app.UseSwagger();
// Swagger可视化界面 // Swagger可视化界面
app.UseSwaggerUI(options => app.UseAbpSwaggerUI(options =>
{ {
options.SwaggerEndpoint("/swagger/v1/swagger.json", "Support IdentityServer API"); options.SwaggerEndpoint("/swagger/v1/swagger.json", "Support Identity Service API");
var configuration = context.GetConfiguration();
options.OAuthClientId(configuration["AuthServer:SwaggerClientId"]);
options.OAuthScopes(configuration["AuthServer:Audience"]);
}); });
// 审计日志 // 审计日志
app.UseAuditing(); app.UseAuditing();

2
aspnet-core/services/LY.MicroService.AuthServer.HttpApi.Host/LY.MicroService.AuthServer.HttpApi.Host.csproj

@ -26,7 +26,6 @@
<PackageReference Include="Serilog.Settings.Configuration" /> <PackageReference Include="Serilog.Settings.Configuration" />
<PackageReference Include="Serilog.Sinks.Elasticsearch" /> <PackageReference Include="Serilog.Sinks.Elasticsearch" />
<PackageReference Include="Serilog.Sinks.File" /> <PackageReference Include="Serilog.Sinks.File" />
<PackageReference Include="Swashbuckle.AspNetCore" />
<PackageReference Include="Volo.Abp.AspNetCore.Serilog" /> <PackageReference Include="Volo.Abp.AspNetCore.Serilog" />
<PackageReference Include="Volo.Abp.Caching.StackExchangeRedis" /> <PackageReference Include="Volo.Abp.Caching.StackExchangeRedis" />
<PackageReference Include="Volo.Abp.AspNetCore.Authentication.JwtBearer" /> <PackageReference Include="Volo.Abp.AspNetCore.Authentication.JwtBearer" />
@ -41,6 +40,7 @@
<PackageReference Include="Volo.Abp.OpenIddict.EntityFrameworkCore" /> <PackageReference Include="Volo.Abp.OpenIddict.EntityFrameworkCore" />
<PackageReference Include="Volo.Abp.FeatureManagement.EntityFrameworkCore" /> <PackageReference Include="Volo.Abp.FeatureManagement.EntityFrameworkCore" />
<PackageReference Include="Volo.Abp.SettingManagement.EntityFrameworkCore" /> <PackageReference Include="Volo.Abp.SettingManagement.EntityFrameworkCore" />
<PackageReference Include="Volo.Abp.Swashbuckle" />
<PackageReference Include="Volo.Abp.PermissionManagement.EntityFrameworkCore" /> <PackageReference Include="Volo.Abp.PermissionManagement.EntityFrameworkCore" />
</ItemGroup> </ItemGroup>

5
aspnet-core/services/LY.MicroService.AuthServer.HttpApi.Host/appsettings.Development.json

@ -11,7 +11,7 @@
}, },
"App": { "App": {
"ShowPii": true, "ShowPii": true,
"CorsOrigins": "http://127.0.0.1:3100", "CorsOrigins": [ "http://127.0.0.1:5666" ],
"Urls": { "Urls": {
"Applications": { "Applications": {
"MVC": { "MVC": {
@ -92,7 +92,8 @@
"Authority": "http://127.0.0.1:44385", "Authority": "http://127.0.0.1:44385",
"Audience": "lingyun-abp-application", "Audience": "lingyun-abp-application",
"MapInboundClaims": false, "MapInboundClaims": false,
"RequireHttpsMetadata": false "RequireHttpsMetadata": false,
"SwaggerClientId": "vue-oauth-client"
}, },
"AuditLogging": { "AuditLogging": {
"Elasticsearch": { "Elasticsearch": {

16
aspnet-core/services/LY.MicroService.AuthServer/AuthServerModule.Configure.cs

@ -430,12 +430,18 @@ public partial class AuthServerModule
{ {
options.AddDefaultPolicy(builder => options.AddDefaultPolicy(builder =>
{ {
var corsOrigins = configuration.GetSection("App:CorsOrigins").Get<List<string>>();
if (corsOrigins == null || corsOrigins.Count == 0)
{
corsOrigins = configuration["App:CorsOrigins"]?
.Split(",", StringSplitOptions.RemoveEmptyEntries)
.Select(o => o.RemovePostFix("/"))
.ToList() ?? new List<string>();
}
builder builder
.WithOrigins( .WithOrigins(corsOrigins
configuration["App:CorsOrigins"] .Select(o => o.RemovePostFix("/"))
.Split(",", StringSplitOptions.RemoveEmptyEntries) .ToArray()
.Select(o => o.RemovePostFix("/"))
.ToArray()
) )
.WithAbpExposedHeaders() .WithAbpExposedHeaders()
.WithAbpWrapExposedHeaders() .WithAbpWrapExposedHeaders()

319
aspnet-core/services/LY.MicroService.AuthServer/DataSeeder/AuthServerDataSeedContributor.cs

@ -2,10 +2,13 @@
using LINGYUN.Abp.OpenIddict.LinkUser; using LINGYUN.Abp.OpenIddict.LinkUser;
using LINGYUN.Abp.OpenIddict.Sms; using LINGYUN.Abp.OpenIddict.Sms;
using LINGYUN.Abp.OpenIddict.WeChat; using LINGYUN.Abp.OpenIddict.WeChat;
using Microsoft.Extensions.Configuration;
using OpenIddict.Abstractions; using OpenIddict.Abstractions;
using System; using System;
using System.Collections.Generic;
using System.Globalization; using System.Globalization;
using System.Threading.Tasks; using System.Threading.Tasks;
using Volo.Abp.Authorization.Permissions;
using Volo.Abp.Data; using Volo.Abp.Data;
using Volo.Abp.DependencyInjection; using Volo.Abp.DependencyInjection;
using Volo.Abp.Guids; using Volo.Abp.Guids;
@ -13,173 +16,259 @@ using Volo.Abp.Identity;
using Volo.Abp.MultiTenancy; using Volo.Abp.MultiTenancy;
using Volo.Abp.OpenIddict.Applications; using Volo.Abp.OpenIddict.Applications;
using Volo.Abp.OpenIddict.Scopes; using Volo.Abp.OpenIddict.Scopes;
using Volo.Abp.PermissionManagement;
namespace LY.MicroService.AuthServer.DataSeeder; namespace LY.MicroService.AuthServer.DataSeeder;
public class ServerDataSeedContributor : IDataSeedContributor, ITransientDependency public class ServerDataSeedContributor : IDataSeedContributor, ITransientDependency
{ {
private readonly IConfiguration _configuration;
private readonly ICurrentTenant _currentTenant; private readonly ICurrentTenant _currentTenant;
private readonly IGuidGenerator _guidGenerator;
private readonly IOpenIddictApplicationManager _applicationManager; private readonly IOpenIddictApplicationManager _applicationManager;
private readonly IOpenIddictApplicationRepository _applicationRepository; private readonly IOpenIddictApplicationRepository _applicationRepository;
private readonly IPermissionDataSeeder _permissionDataSeeder;
private readonly IOpenIddictScopeManager _scopeManager; private readonly IOpenIddictScopeManager _scopeManager;
private readonly IOpenIddictScopeRepository _scopeRepository; private readonly IOpenIddictScopeRepository _scopeRepository;
private readonly IIdentityClaimTypeRepository _claimTypeRepository;
public ServerDataSeedContributor( public ServerDataSeedContributor(
IConfiguration configuration,
ICurrentTenant currentTenant, ICurrentTenant currentTenant,
IGuidGenerator guidGenerator,
IOpenIddictScopeManager scopeManager, IOpenIddictScopeManager scopeManager,
IOpenIddictScopeRepository scopeRepository, IOpenIddictScopeRepository scopeRepository,
IPermissionDataSeeder permissionDataSeeder,
IOpenIddictApplicationManager applicationManager, IOpenIddictApplicationManager applicationManager,
IOpenIddictApplicationRepository applicationRepository, IOpenIddictApplicationRepository applicationRepository)
IIdentityClaimTypeRepository identityClaimTypeRepository)
{ {
_configuration = configuration;
_currentTenant = currentTenant; _currentTenant = currentTenant;
_guidGenerator = guidGenerator;
_scopeManager = scopeManager; _scopeManager = scopeManager;
_scopeRepository = scopeRepository; _scopeRepository = scopeRepository;
_permissionDataSeeder = permissionDataSeeder;
_applicationManager = applicationManager; _applicationManager = applicationManager;
_applicationRepository = applicationRepository; _applicationRepository = applicationRepository;
_claimTypeRepository = identityClaimTypeRepository;
} }
public async Task SeedAsync(DataSeedContext context) public async Task SeedAsync(DataSeedContext context)
{ {
if (!await _claimTypeRepository.AnyAsync(IdentityConsts.ClaimType.Avatar.Name)) using (_currentTenant.Change(context.TenantId))
{ {
await _claimTypeRepository.InsertAsync( await CreateScopeAsync("lingyun-abp-application");
new IdentityClaimType( await CreateApplicationAsync("lingyun-abp-application");
_guidGenerator.Create(),
IdentityConsts.ClaimType.Avatar.Name,
isStatic: true
)
);
} }
}
if (await _scopeRepository.FindByNameAsync("lingyun-abp-application") == null) private async Task CreateScopeAsync(string scope)
{
if (await _scopeRepository.FindByNameAsync(scope) == null)
{ {
await _scopeManager.CreateAsync(new OpenIddictScopeDescriptor() await _scopeManager.CreateAsync(new OpenIddictScopeDescriptor()
{ {
Name = "lingyun-abp-application", Name = scope,
DisplayName = "lingyun-abp-application", DisplayName = scope + " access",
DisplayNames = DisplayNames =
{ {
[CultureInfo.GetCultureInfo("en")] = "abp application", [CultureInfo.GetCultureInfo("zh-Hans")] = "Abp API 应用程序访问",
[CultureInfo.GetCultureInfo("zh-Hans")] = "abp application", [CultureInfo.GetCultureInfo("en")] = "Abp API Application Access"
}, },
Resources = Resources =
{ {
"lingyun-abp-application" scope
} }
}); });
} }
}
if (await _applicationRepository.FindByClientIdAsync("vue-admin-client") == null) private async Task CreateApplicationAsync(string scope)
{
var configurationSection = _configuration.GetSection("OpenIddict:Applications");
var vueClientId = configurationSection["VueAdmin:ClientId"];
if (!vueClientId.IsNullOrWhiteSpace())
{ {
await _applicationManager.CreateAsync(new OpenIddictApplicationDescriptor var vueClientRootUrl = configurationSection["VueAdmin:RootUrl"].EnsureEndsWith('/');
if (await _applicationRepository.FindByClientIdAsync(vueClientId) == null)
{ {
ClientId = "vue-admin-client", await _applicationManager.CreateAsync(new OpenIddictApplicationDescriptor
ClientSecret = "1q2w3e*",
ConsentType = OpenIddictConstants.ConsentTypes.Explicit,
DisplayName = "Vue Vben Admin Abp Application",
PostLogoutRedirectUris =
{ {
new Uri("https://127.0.0.1:3100/signout-callback-oidc"), ClientId = vueClientId,
new Uri("http://127.0.0.1:3100") ClientSecret = configurationSection["VueAdmin:ClientSecret"],
}, ApplicationType = OpenIddictConstants.ApplicationTypes.Web,
RedirectUris = ConsentType = OpenIddictConstants.ConsentTypes.Explicit,
DisplayName = "Abp Vue Admin Client",
PostLogoutRedirectUris =
{
new Uri(vueClientRootUrl + "signout-callback"),
new Uri(vueClientRootUrl)
},
RedirectUris =
{
new Uri(vueClientRootUrl + "signin-callback"),
new Uri(vueClientRootUrl)
},
Permissions =
{
OpenIddictConstants.Permissions.Endpoints.Authorization,
OpenIddictConstants.Permissions.Endpoints.Token,
OpenIddictConstants.Permissions.Endpoints.DeviceAuthorization,
OpenIddictConstants.Permissions.Endpoints.Introspection,
OpenIddictConstants.Permissions.Endpoints.Revocation,
OpenIddictConstants.Permissions.Endpoints.EndSession,
OpenIddictConstants.Permissions.GrantTypes.AuthorizationCode,
OpenIddictConstants.Permissions.GrantTypes.Implicit,
OpenIddictConstants.Permissions.GrantTypes.Password,
OpenIddictConstants.Permissions.GrantTypes.RefreshToken,
OpenIddictConstants.Permissions.GrantTypes.DeviceCode,
OpenIddictConstants.Permissions.GrantTypes.ClientCredentials,
OpenIddictConstants.Permissions.ResponseTypes.Code,
OpenIddictConstants.Permissions.ResponseTypes.CodeIdToken,
OpenIddictConstants.Permissions.ResponseTypes.CodeIdTokenToken,
OpenIddictConstants.Permissions.ResponseTypes.CodeToken,
OpenIddictConstants.Permissions.ResponseTypes.IdToken,
OpenIddictConstants.Permissions.ResponseTypes.IdTokenToken,
OpenIddictConstants.Permissions.ResponseTypes.None,
OpenIddictConstants.Permissions.ResponseTypes.Token,
OpenIddictConstants.Permissions.Scopes.Roles,
OpenIddictConstants.Permissions.Scopes.Profile,
OpenIddictConstants.Permissions.Scopes.Email,
OpenIddictConstants.Permissions.Scopes.Address,
OpenIddictConstants.Permissions.Scopes.Phone,
OpenIddictConstants.Permissions.Prefixes.Scope + scope
}
});
var vueClientPermissions = new string[1]
{ {
new Uri("https://127.0.0.1:3100/signin-oidc"), "AbpIdentity.UserLookup"
new Uri("http://127.0.0.1:3100") };
}, await _permissionDataSeeder.SeedAsync(ClientPermissionValueProvider.ProviderName, vueClientId, vueClientPermissions);
Permissions = }
}
var internalServiceClientId = configurationSection["InternalService:ClientId"];
if (!internalServiceClientId.IsNullOrWhiteSpace())
{
if (await _applicationRepository.FindByClientIdAsync(internalServiceClientId) == null)
{
await _applicationManager.CreateAsync(new OpenIddictApplicationDescriptor
{ {
OpenIddictConstants.Permissions.Endpoints.Authorization, ClientId = internalServiceClientId,
OpenIddictConstants.Permissions.Endpoints.Token, ClientSecret = configurationSection["InternalService:ClientSecret"],
OpenIddictConstants.Permissions.Endpoints.DeviceAuthorization, ClientType = OpenIddictConstants.ClientTypes.Confidential,
OpenIddictConstants.Permissions.Endpoints.Introspection, ConsentType = OpenIddictConstants.ConsentTypes.Explicit,
OpenIddictConstants.Permissions.Endpoints.Revocation, ApplicationType = OpenIddictConstants.ApplicationTypes.Native,
OpenIddictConstants.Permissions.Endpoints.EndSession, DisplayName = "Abp Vue Admin Client",
Permissions =
OpenIddictConstants.Permissions.GrantTypes.AuthorizationCode, {
OpenIddictConstants.Permissions.GrantTypes.Implicit, OpenIddictConstants.Permissions.Endpoints.Authorization,
OpenIddictConstants.Permissions.GrantTypes.Password, OpenIddictConstants.Permissions.Endpoints.Token,
OpenIddictConstants.Permissions.GrantTypes.RefreshToken, OpenIddictConstants.Permissions.Endpoints.DeviceAuthorization,
OpenIddictConstants.Permissions.GrantTypes.DeviceCode, OpenIddictConstants.Permissions.Endpoints.Introspection,
OpenIddictConstants.Permissions.GrantTypes.ClientCredentials, OpenIddictConstants.Permissions.Endpoints.Revocation,
OpenIddictConstants.Permissions.Prefixes.GrantType + WeChatTokenExtensionGrantConsts.OfficialGrantType, OpenIddictConstants.Permissions.Endpoints.EndSession,
OpenIddictConstants.Permissions.Prefixes.GrantType + WeChatTokenExtensionGrantConsts.MiniProgramGrantType,
OpenIddictConstants.Permissions.Prefixes.GrantType + SmsTokenExtensionGrantConsts.GrantType, OpenIddictConstants.Permissions.GrantTypes.AuthorizationCode,
OpenIddictConstants.Permissions.Prefixes.GrantType + LinkUserTokenExtensionGrantConsts.GrantType, OpenIddictConstants.Permissions.GrantTypes.Implicit,
OpenIddictConstants.Permissions.GrantTypes.Password,
OpenIddictConstants.Permissions.ResponseTypes.Code, OpenIddictConstants.Permissions.GrantTypes.RefreshToken,
OpenIddictConstants.Permissions.ResponseTypes.CodeIdToken, OpenIddictConstants.Permissions.GrantTypes.DeviceCode,
OpenIddictConstants.Permissions.ResponseTypes.CodeIdTokenToken, OpenIddictConstants.Permissions.GrantTypes.ClientCredentials,
OpenIddictConstants.Permissions.ResponseTypes.CodeToken,
OpenIddictConstants.Permissions.ResponseTypes.IdToken, OpenIddictConstants.Permissions.ResponseTypes.Code,
OpenIddictConstants.Permissions.ResponseTypes.IdTokenToken, OpenIddictConstants.Permissions.ResponseTypes.CodeIdToken,
OpenIddictConstants.Permissions.ResponseTypes.None, OpenIddictConstants.Permissions.ResponseTypes.CodeIdTokenToken,
OpenIddictConstants.Permissions.ResponseTypes.Token, OpenIddictConstants.Permissions.ResponseTypes.CodeToken,
OpenIddictConstants.Permissions.ResponseTypes.IdToken,
OpenIddictConstants.Permissions.Scopes.Roles, OpenIddictConstants.Permissions.ResponseTypes.IdTokenToken,
OpenIddictConstants.Permissions.Scopes.Profile, OpenIddictConstants.Permissions.ResponseTypes.None,
OpenIddictConstants.Permissions.Scopes.Email, OpenIddictConstants.Permissions.ResponseTypes.Token,
OpenIddictConstants.Permissions.Scopes.Address,
OpenIddictConstants.Permissions.Scopes.Phone, OpenIddictConstants.Permissions.Scopes.Roles,
OpenIddictConstants.Permissions.Prefixes.Scope + WeChatTokenExtensionGrantConsts.ProfileKey, OpenIddictConstants.Permissions.Scopes.Profile,
OpenIddictConstants.Permissions.Prefixes.Scope + "lingyun-abp-application" OpenIddictConstants.Permissions.Scopes.Email,
} OpenIddictConstants.Permissions.Scopes.Address,
}); OpenIddictConstants.Permissions.Scopes.Phone,
OpenIddictConstants.Permissions.Prefixes.Scope + scope
}
});
var internalServicePermissions = new string[2]
{
"AbpIdentity.UserLookup","AbpIdentity.Users"
};
await _permissionDataSeeder.SeedAsync(ClientPermissionValueProvider.ProviderName, internalServiceClientId, internalServicePermissions);
}
} }
if (await _applicationRepository.FindByClientIdAsync("InternalServiceClient") == null) var oauthClientId = configurationSection["VueOAuthClient:ClientId"];
if (!oauthClientId.IsNullOrWhiteSpace())
{ {
await _applicationManager.CreateAsync(new OpenIddictApplicationDescriptor var oauthClientRootUrls = configurationSection.GetSection("VueOAuthClient:RootUrls").Get<List<string>>();
if (await _applicationRepository.FindByClientIdAsync(oauthClientId) == null)
{ {
ClientId = "InternalServiceClient", var application = new OpenIddictApplicationDescriptor
ClientSecret = "1q2w3e*",
ClientType = OpenIddictConstants.ClientTypes.Confidential,
ConsentType = OpenIddictConstants.ConsentTypes.Explicit,
DisplayName = "Internal Service Client",
PostLogoutRedirectUris = {},
RedirectUris = {},
Permissions =
{ {
OpenIddictConstants.Permissions.Endpoints.Authorization, ClientId = oauthClientId,
OpenIddictConstants.Permissions.Endpoints.Token, ClientSecret = null,
OpenIddictConstants.Permissions.Endpoints.DeviceAuthorization, ApplicationType = OpenIddictConstants.ApplicationTypes.Web,
OpenIddictConstants.Permissions.Endpoints.Introspection, ConsentType = OpenIddictConstants.ConsentTypes.Implicit,
OpenIddictConstants.Permissions.Endpoints.Revocation, DisplayName = "OAuth Client",
OpenIddictConstants.Permissions.Endpoints.EndSession, PostLogoutRedirectUris = { },
RedirectUris = { },
OpenIddictConstants.Permissions.GrantTypes.AuthorizationCode, Permissions =
OpenIddictConstants.Permissions.GrantTypes.Implicit, {
OpenIddictConstants.Permissions.GrantTypes.Password, OpenIddictConstants.Permissions.Endpoints.Authorization,
OpenIddictConstants.Permissions.GrantTypes.RefreshToken, OpenIddictConstants.Permissions.Endpoints.Token,
OpenIddictConstants.Permissions.GrantTypes.DeviceCode, OpenIddictConstants.Permissions.Endpoints.DeviceAuthorization,
OpenIddictConstants.Permissions.GrantTypes.ClientCredentials, OpenIddictConstants.Permissions.Endpoints.Introspection,
OpenIddictConstants.Permissions.Endpoints.Revocation,
OpenIddictConstants.Permissions.ResponseTypes.Code, OpenIddictConstants.Permissions.Endpoints.EndSession,
OpenIddictConstants.Permissions.ResponseTypes.CodeIdToken,
OpenIddictConstants.Permissions.ResponseTypes.CodeIdTokenToken, OpenIddictConstants.Permissions.GrantTypes.AuthorizationCode,
OpenIddictConstants.Permissions.ResponseTypes.CodeToken, OpenIddictConstants.Permissions.GrantTypes.RefreshToken,
OpenIddictConstants.Permissions.ResponseTypes.IdToken,
OpenIddictConstants.Permissions.ResponseTypes.IdTokenToken, OpenIddictConstants.Permissions.ResponseTypes.Code,
OpenIddictConstants.Permissions.ResponseTypes.None, OpenIddictConstants.Permissions.ResponseTypes.CodeIdToken,
OpenIddictConstants.Permissions.ResponseTypes.Token, OpenIddictConstants.Permissions.ResponseTypes.CodeIdTokenToken,
OpenIddictConstants.Permissions.ResponseTypes.CodeToken,
OpenIddictConstants.Permissions.Scopes.Roles, OpenIddictConstants.Permissions.ResponseTypes.IdToken,
OpenIddictConstants.Permissions.Scopes.Profile, OpenIddictConstants.Permissions.ResponseTypes.IdTokenToken,
OpenIddictConstants.Permissions.Scopes.Email, OpenIddictConstants.Permissions.ResponseTypes.None,
OpenIddictConstants.Permissions.Scopes.Address, OpenIddictConstants.Permissions.ResponseTypes.Token,
OpenIddictConstants.Permissions.Scopes.Phone,
OpenIddictConstants.Permissions.Scopes.Roles,
OpenIddictConstants.Permissions.Prefixes.Scope + "lingyun-abp-application" OpenIddictConstants.Permissions.Scopes.Profile,
} OpenIddictConstants.Permissions.Scopes.Email,
}); OpenIddictConstants.Permissions.Scopes.Address,
OpenIddictConstants.Permissions.Scopes.Phone,
OpenIddictConstants.Permissions.Prefixes.Scope + scope
}
};
oauthClientRootUrls.ForEach(url =>
{
application.PostLogoutRedirectUris.AddIfNotContains(new Uri(url.EnsureEndsWith('/')));
application.PostLogoutRedirectUris.AddIfNotContains(new Uri(url.EnsureEndsWith('/') + "signout-callback"));
application.RedirectUris.AddIfNotContains(new Uri(url));
application.RedirectUris.AddIfNotContains(new Uri(url.EnsureEndsWith('/') + "signin-callback"));
application.RedirectUris.AddIfNotContains(new Uri(url.EnsureEndsWith('/') + "swagger/oauth2-redirect.html"));
});
await _applicationManager.CreateAsync(application);
var oauthClientPermissions = new string[1]
{
"AbpIdentity.UserLookup"
};
await _permissionDataSeeder.SeedAsync(ClientPermissionValueProvider.ProviderName, oauthClientId, oauthClientPermissions);
}
} }
} }
} }

34
aspnet-core/services/LY.MicroService.AuthServer/appsettings.Development.json

@ -10,7 +10,18 @@
"configCacheEncrypt": true "configCacheEncrypt": true
}, },
"App": { "App": {
"CorsOrigins": "http://127.0.0.1:3100", "CorsOrigins": [
"http://127.0.0.1:5666",
"http://127.0.0.1:30010",
"http://127.0.0.1:30015",
"http://127.0.0.1:30020",
"http://127.0.0.1:30025",
"http://127.0.0.1:30030",
"http://127.0.0.1:30040",
"http://127.0.0.1:30045",
"http://127.0.0.1:30050",
"http://127.0.0.1:30060"
],
"Urls": { "Urls": {
"Applications": { "Applications": {
"MVC": { "MVC": {
@ -24,7 +35,7 @@
"RootUrl": "http://127.0.0.1:44385/" "RootUrl": "http://127.0.0.1:44385/"
}, },
"VueVbenAdmin": { "VueVbenAdmin": {
"RootUrl": "http://127.0.0.1:3100/", "RootUrl": "http://127.0.0.1:5666/",
"Urls": { "Urls": {
"Abp.Account.EmailConfirm": "account/email-confirm", "Abp.Account.EmailConfirm": "account/email-confirm",
"Abp.Account.EmailVerifyLogin": "account/verify-code" "Abp.Account.EmailVerifyLogin": "account/verify-code"
@ -95,14 +106,29 @@
}, },
"OpenIddict": { "OpenIddict": {
"Applications": { "Applications": {
"AuthVueAdmin": { "VueAdmin": {
"ClientId": "vue-admin-client", "ClientId": "vue-admin-client",
"ClientSecret": "1q2w3e*", "ClientSecret": "1q2w3e*",
"RootUrl": "http://127.0.0.1:3100/" "RootUrl": "http://127.0.0.1:5666/"
}, },
"InternalService": { "InternalService": {
"ClientId": "InternalServiceClient", "ClientId": "InternalServiceClient",
"ClientSecret": "1q2w3e*" "ClientSecret": "1q2w3e*"
},
"VueOAuthClient": {
"ClientId": "vue-oauth-client",
"RootUrls": [
"http://127.0.0.1:5666",
"http://127.0.0.1:30010",
"http://127.0.0.1:30015",
"http://127.0.0.1:30020",
"http://127.0.0.1:30025",
"http://127.0.0.1:30030",
"http://127.0.0.1:30040",
"http://127.0.0.1:30045",
"http://127.0.0.1:30050",
"http://127.0.0.1:30060"
]
} }
} }
}, },

53
aspnet-core/services/LY.MicroService.BackendAdmin.HttpApi.Host/BackendAdminHttpApiHostModule.Configure.cs

@ -314,13 +314,32 @@ public partial class BackendAdminHttpApiHostModule
}); });
} }
private void ConfigureSwagger(IServiceCollection services) private void ConfigureSwagger(IServiceCollection services, IConfiguration configuration)
{ {
// Swagger // Swagger
services.AddSwaggerGen( services.AddAbpSwaggerGenWithOAuth(
configuration["AuthServer:Authority"],
new Dictionary<string, string>
{
{ configuration["AuthServer:Audience"], "Admin Service API"}
},
options => options =>
{ {
options.SwaggerDoc("v1", new OpenApiInfo { Title = "BackendAdmin API", Version = "v1" }); options.SwaggerDoc("v1", new OpenApiInfo
{
Title = "Admin Service API", Version = "v1",
Contact = new OpenApiContact
{
Name = "colin",
Email = "colin.in@foxmail.com",
Url = new Uri("https://github.com/colinin")
},
License = new OpenApiLicense
{
Name = "MIT",
Url = new Uri("https://github.com/colinin/abp-next-admin/blob/master/LICENSE")
}
});
options.DocInclusionPredicate((docName, description) => true); options.DocInclusionPredicate((docName, description) => true);
options.CustomSchemaIds(type => type.FullName); options.CustomSchemaIds(type => type.FullName);
options.AddSecurityDefinition("Bearer", new OpenApiSecurityScheme options.AddSecurityDefinition("Bearer", new OpenApiSecurityScheme
@ -334,13 +353,13 @@ public partial class BackendAdminHttpApiHostModule
}); });
options.AddSecurityRequirement(new OpenApiSecurityRequirement options.AddSecurityRequirement(new OpenApiSecurityRequirement
{ {
{
new OpenApiSecurityScheme
{ {
new OpenApiSecurityScheme Reference = new OpenApiReference { Type = ReferenceType.SecurityScheme, Id = "Bearer" }
{ },
Reference = new OpenApiReference { Type = ReferenceType.SecurityScheme, Id = "Bearer" } new string[] { }
}, }
new string[] { }
}
}); });
options.OperationFilter<TenantHeaderParamter>(); options.OperationFilter<TenantHeaderParamter>();
}); });
@ -394,12 +413,18 @@ public partial class BackendAdminHttpApiHostModule
{ {
options.AddDefaultPolicy(builder => options.AddDefaultPolicy(builder =>
{ {
var corsOrigins = configuration.GetSection("App:CorsOrigins").Get<List<string>>();
if (corsOrigins == null || corsOrigins.Count == 0)
{
corsOrigins = configuration["App:CorsOrigins"]?
.Split(",", StringSplitOptions.RemoveEmptyEntries)
.Select(o => o.RemovePostFix("/"))
.ToList() ?? new List<string>();
}
builder builder
.WithOrigins( .WithOrigins(corsOrigins
configuration["App:CorsOrigins"] .Select(o => o.RemovePostFix("/"))
.Split(",", StringSplitOptions.RemoveEmptyEntries) .ToArray()
.Select(o => o.RemovePostFix("/"))
.ToArray()
) )
.WithAbpExposedHeaders() .WithAbpExposedHeaders()
.WithAbpWrapExposedHeaders() .WithAbpWrapExposedHeaders()

12
aspnet-core/services/LY.MicroService.BackendAdmin.HttpApi.Host/BackendAdminHttpApiHostModule.cs

@ -54,6 +54,7 @@ using Volo.Abp.PermissionManagement.EntityFrameworkCore;
using Volo.Abp.PermissionManagement.Identity; using Volo.Abp.PermissionManagement.Identity;
using Volo.Abp.PermissionManagement.IdentityServer; using Volo.Abp.PermissionManagement.IdentityServer;
using Volo.Abp.SettingManagement.EntityFrameworkCore; using Volo.Abp.SettingManagement.EntityFrameworkCore;
using Volo.Abp.Swashbuckle;
namespace LY.MicroService.BackendAdmin; namespace LY.MicroService.BackendAdmin;
@ -123,6 +124,7 @@ namespace LY.MicroService.BackendAdmin;
typeof(AbpAspNetCoreMvcWrapperModule), typeof(AbpAspNetCoreMvcWrapperModule),
typeof(AbpAspNetCoreHttpOverridesModule), typeof(AbpAspNetCoreHttpOverridesModule),
typeof(AbpClaimsMappingModule), typeof(AbpClaimsMappingModule),
typeof(AbpSwashbuckleModule),
typeof(AbpAutofacModule) typeof(AbpAutofacModule)
)] )]
public partial class BackendAdminHttpApiHostModule : AbpModule public partial class BackendAdminHttpApiHostModule : AbpModule
@ -155,11 +157,11 @@ public partial class BackendAdminHttpApiHostModule : AbpModule
ConfigureTiming(configuration); ConfigureTiming(configuration);
ConfigureCaching(configuration); ConfigureCaching(configuration);
ConfigureAuditing(configuration); ConfigureAuditing(configuration);
ConfigureSwagger(context.Services);
ConfigureMultiTenancy(configuration); ConfigureMultiTenancy(configuration);
ConfigureJsonSerializer(configuration); ConfigureJsonSerializer(configuration);
ConfigureMvc(context.Services, configuration); ConfigureMvc(context.Services, configuration);
ConfigureCors(context.Services, configuration); ConfigureCors(context.Services, configuration);
ConfigureSwagger(context.Services, configuration);
ConfigureDistributedLocking(context.Services, configuration); ConfigureDistributedLocking(context.Services, configuration);
ConfigureSeedWorker(context.Services, hostingEnvironment.IsDevelopment()); ConfigureSeedWorker(context.Services, hostingEnvironment.IsDevelopment());
ConfigureSecurity(context.Services, configuration, hostingEnvironment.IsDevelopment()); ConfigureSecurity(context.Services, configuration, hostingEnvironment.IsDevelopment());
@ -193,9 +195,13 @@ public partial class BackendAdminHttpApiHostModule : AbpModule
// Swagger // Swagger
app.UseSwagger(); app.UseSwagger();
// Swagger可视化界面 // Swagger可视化界面
app.UseSwaggerUI(options => app.UseAbpSwaggerUI(options =>
{ {
options.SwaggerEndpoint("/swagger/v1/swagger.json", "Support BackendAdmin API"); options.SwaggerEndpoint("/swagger/v1/swagger.json", "Support Admin Service API");
var configuration = context.GetConfiguration();
options.OAuthClientId(configuration["AuthServer:SwaggerClientId"]);
options.OAuthScopes(configuration["AuthServer:Audience"]);
}); });
// 审计日志 // 审计日志
app.UseAuditing(); app.UseAuditing();

6
aspnet-core/services/LY.MicroService.BackendAdmin.HttpApi.Host/LY.MicroService.BackendAdmin.HttpApi.Host.csproj

@ -20,10 +20,6 @@
<PackageReference Include="DotNetCore.CAP.RabbitMQ" /> <PackageReference Include="DotNetCore.CAP.RabbitMQ" />
<PackageReference Include="DistributedLock.Redis" /> <PackageReference Include="DistributedLock.Redis" />
<PackageReference Include="Microsoft.AspNetCore.DataProtection.StackExchangeRedis" /> <PackageReference Include="Microsoft.AspNetCore.DataProtection.StackExchangeRedis" />
<!--<PackageReference Include="Microsoft.EntityFrameworkCore.Design" Version="7.0.5">
<PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference>-->
<PackageReference Include="Serilog.AspNetCore" /> <PackageReference Include="Serilog.AspNetCore" />
<PackageReference Include="Serilog.Enrichers.Environment" /> <PackageReference Include="Serilog.Enrichers.Environment" />
<PackageReference Include="Serilog.Enrichers.Assembly" /> <PackageReference Include="Serilog.Enrichers.Assembly" />
@ -32,7 +28,6 @@
<PackageReference Include="Serilog.Settings.Configuration" /> <PackageReference Include="Serilog.Settings.Configuration" />
<PackageReference Include="Serilog.Sinks.Elasticsearch" /> <PackageReference Include="Serilog.Sinks.Elasticsearch" />
<PackageReference Include="Serilog.Sinks.File" /> <PackageReference Include="Serilog.Sinks.File" />
<PackageReference Include="Swashbuckle.AspNetCore" />
<PackageReference Include="Volo.Abp.Caching.StackExchangeRedis" /> <PackageReference Include="Volo.Abp.Caching.StackExchangeRedis" />
<PackageReference Include="Volo.Abp.AspNetCore.Serilog" /> <PackageReference Include="Volo.Abp.AspNetCore.Serilog" />
<PackageReference Include="Volo.Abp.AspNetCore.Mvc.UI.MultiTenancy" /> <PackageReference Include="Volo.Abp.AspNetCore.Mvc.UI.MultiTenancy" />
@ -48,6 +43,7 @@
<PackageReference Include="Volo.Abp.PermissionManagement.Domain.Identity" /> <PackageReference Include="Volo.Abp.PermissionManagement.Domain.Identity" />
<PackageReference Include="Volo.Abp.PermissionManagement.Domain.IdentityServer" /> <PackageReference Include="Volo.Abp.PermissionManagement.Domain.IdentityServer" />
<PackageReference Include="Volo.Abp.PermissionManagement.HttpApi" /> <PackageReference Include="Volo.Abp.PermissionManagement.HttpApi" />
<PackageReference Include="Volo.Abp.Swashbuckle" />
<PackageReference Include="Volo.Abp.SettingManagement.EntityFrameworkCore" /> <PackageReference Include="Volo.Abp.SettingManagement.EntityFrameworkCore" />
<PackageReference Include="Volo.Abp.PermissionManagement.EntityFrameworkCore" /> <PackageReference Include="Volo.Abp.PermissionManagement.EntityFrameworkCore" />
</ItemGroup> </ItemGroup>

5
aspnet-core/services/LY.MicroService.BackendAdmin.HttpApi.Host/appsettings.Development.json

@ -10,8 +10,8 @@
"configCacheEncrypt": true "configCacheEncrypt": true
}, },
"App": { "App": {
"CorsOrigins": "http://127.0.0.1:3100",
"ShowPii": true, "ShowPii": true,
"CorsOrigins": [ "http://127.0.0.1:5666" ],
"RefreshClaimsUrl": "http://127.0.0.1:30015" "RefreshClaimsUrl": "http://127.0.0.1:30015"
}, },
"Auditing": { "Auditing": {
@ -66,7 +66,8 @@
"Authority": "http://127.0.0.1:44385/", "Authority": "http://127.0.0.1:44385/",
"Audience": "lingyun-abp-application", "Audience": "lingyun-abp-application",
"MapInboundClaims": false, "MapInboundClaims": false,
"RequireHttpsMetadata": false "RequireHttpsMetadata": false,
"SwaggerClientId": "vue-oauth-client"
}, },
"RemoteServices": { "RemoteServices": {
"Platform": { "Platform": {

56
aspnet-core/services/LY.MicroService.IdentityServer.HttpApi.Host/IdentityServerHttpApiHostModule.Configure.cs

@ -346,13 +346,32 @@ public partial class IdentityServerHttpApiHostModule
}); });
} }
private void ConfigureSwagger(IServiceCollection services) private void ConfigureSwagger(IServiceCollection services, IConfiguration configuration)
{ {
// Swagger // Swagger
services.AddSwaggerGen( services.AddAbpSwaggerGenWithOAuth(
configuration["AuthServer:Authority"],
new Dictionary<string, string>
{
{ configuration["AuthServer:Audience"], "Identity Service API"}
},
options => options =>
{ {
options.SwaggerDoc("v1", new OpenApiInfo { Title = "IdentityServer4 API", Version = "v1" }); options.SwaggerDoc("v1", new OpenApiInfo
{
Title = "Identity Service API", Version = "v1",
Contact = new OpenApiContact
{
Name = "colin",
Email = "colin.in@foxmail.com",
Url = new Uri("https://github.com/colinin")
},
License = new OpenApiLicense
{
Name = "MIT",
Url = new Uri("https://github.com/colinin/abp-next-admin/blob/master/LICENSE")
}
});
options.DocInclusionPredicate((docName, description) => true); options.DocInclusionPredicate((docName, description) => true);
options.CustomSchemaIds(type => type.FullName); options.CustomSchemaIds(type => type.FullName);
options.AddSecurityDefinition("Bearer", new OpenApiSecurityScheme options.AddSecurityDefinition("Bearer", new OpenApiSecurityScheme
@ -366,13 +385,13 @@ public partial class IdentityServerHttpApiHostModule
}); });
options.AddSecurityRequirement(new OpenApiSecurityRequirement options.AddSecurityRequirement(new OpenApiSecurityRequirement
{ {
{
new OpenApiSecurityScheme
{ {
new OpenApiSecurityScheme Reference = new OpenApiReference { Type = ReferenceType.SecurityScheme, Id = "Bearer" }
{ },
Reference = new OpenApiReference { Type = ReferenceType.SecurityScheme, Id = "Bearer" } new string[] { }
}, }
new string[] { }
}
}); });
options.OperationFilter<TenantHeaderParamter>(); options.OperationFilter<TenantHeaderParamter>();
}); });
@ -415,16 +434,21 @@ public partial class IdentityServerHttpApiHostModule
{ {
options.AddDefaultPolicy(builder => options.AddDefaultPolicy(builder =>
{ {
var corsOrigins = configuration.GetSection("App:CorsOrigins").Get<List<string>>();
if (corsOrigins == null || corsOrigins.Count == 0)
{
corsOrigins = configuration["App:CorsOrigins"]?
.Split(",", StringSplitOptions.RemoveEmptyEntries)
.Select(o => o.RemovePostFix("/"))
.ToList() ?? new List<string>();
}
builder builder
.WithOrigins( .WithOrigins(corsOrigins
configuration["App:CorsOrigins"] .Select(o => o.RemovePostFix("/"))
.Split(",", StringSplitOptions.RemoveEmptyEntries) .ToArray()
.Select(o => o.RemovePostFix("/"))
.ToArray()
) )
.WithAbpExposedHeaders() .WithAbpExposedHeaders()
// 引用 LINGYUN.Abp.AspNetCore.Mvc.Wrapper 包时可替换为 WithAbpWrapExposedHeaders .WithAbpWrapExposedHeaders()
.WithExposedHeaders("_AbpWrapResult", "_AbpDontWrapResult")
.SetIsOriginAllowedToAllowWildcardSubdomains() .SetIsOriginAllowedToAllowWildcardSubdomains()
.AllowAnyHeader() .AllowAnyHeader()
.AllowAnyMethod() .AllowAnyMethod()

12
aspnet-core/services/LY.MicroService.IdentityServer.HttpApi.Host/IdentityServerHttpApiHostModule.cs

@ -35,6 +35,7 @@ using Volo.Abp.Http.Client;
using Volo.Abp.Modularity; using Volo.Abp.Modularity;
using Volo.Abp.PermissionManagement.EntityFrameworkCore; using Volo.Abp.PermissionManagement.EntityFrameworkCore;
using Volo.Abp.SettingManagement.EntityFrameworkCore; using Volo.Abp.SettingManagement.EntityFrameworkCore;
using Volo.Abp.Swashbuckle;
namespace LY.MicroService.IdentityServer; namespace LY.MicroService.IdentityServer;
@ -78,6 +79,7 @@ namespace LY.MicroService.IdentityServer;
typeof(AbpTelemetrySkyWalkingModule), typeof(AbpTelemetrySkyWalkingModule),
typeof(AbpExporterMiniExcelModule), typeof(AbpExporterMiniExcelModule),
typeof(AbpClaimsMappingModule), typeof(AbpClaimsMappingModule),
typeof(AbpSwashbuckleModule),
typeof(AbpAutofacModule) typeof(AbpAutofacModule)
)] )]
public partial class IdentityServerHttpApiHostModule : AbpModule public partial class IdentityServerHttpApiHostModule : AbpModule
@ -111,11 +113,11 @@ public partial class IdentityServerHttpApiHostModule : AbpModule
ConfigureTiming(configuration); ConfigureTiming(configuration);
ConfigureCaching(configuration); ConfigureCaching(configuration);
ConfigureAuditing(configuration); ConfigureAuditing(configuration);
ConfigureSwagger(context.Services);
ConfigureMultiTenancy(configuration); ConfigureMultiTenancy(configuration);
ConfigureJsonSerializer(configuration); ConfigureJsonSerializer(configuration);
ConfigureMvc(context.Services, configuration); ConfigureMvc(context.Services, configuration);
ConfigureCors(context.Services, configuration); ConfigureCors(context.Services, configuration);
ConfigureSwagger(context.Services, configuration);
ConfigureDistributedLocking(context.Services, configuration); ConfigureDistributedLocking(context.Services, configuration);
ConfigureSecurity(context.Services, configuration, hostingEnvironment.IsDevelopment()); ConfigureSecurity(context.Services, configuration, hostingEnvironment.IsDevelopment());
} }
@ -147,9 +149,13 @@ public partial class IdentityServerHttpApiHostModule : AbpModule
// Swagger // Swagger
app.UseSwagger(); app.UseSwagger();
// Swagger可视化界面 // Swagger可视化界面
app.UseSwaggerUI(options => app.UseAbpSwaggerUI(options =>
{ {
options.SwaggerEndpoint("/swagger/v1/swagger.json", "Support IdentityServer API"); options.SwaggerEndpoint("/swagger/v1/swagger.json", "Support Identity Service API");
var configuration = context.GetConfiguration();
options.OAuthClientId(configuration["AuthServer:SwaggerClientId"]);
options.OAuthScopes(configuration["AuthServer:Audience"]);
}); });
// 审计日志 // 审计日志
app.UseAuditing(); app.UseAuditing();

2
aspnet-core/services/LY.MicroService.IdentityServer.HttpApi.Host/LY.MicroService.identityServer.HttpApi.Host.csproj

@ -33,7 +33,6 @@
<PackageReference Include="Serilog.Settings.Configuration" /> <PackageReference Include="Serilog.Settings.Configuration" />
<PackageReference Include="Serilog.Sinks.Elasticsearch" /> <PackageReference Include="Serilog.Sinks.Elasticsearch" />
<PackageReference Include="Serilog.Sinks.File" /> <PackageReference Include="Serilog.Sinks.File" />
<PackageReference Include="Swashbuckle.AspNetCore" />
<PackageReference Include="Volo.Abp.AspNetCore.Serilog" /> <PackageReference Include="Volo.Abp.AspNetCore.Serilog" />
<PackageReference Include="Volo.Abp.Caching.StackExchangeRedis" /> <PackageReference Include="Volo.Abp.Caching.StackExchangeRedis" />
<PackageReference Include="Volo.Abp.AspNetCore.MultiTenancy" /> <PackageReference Include="Volo.Abp.AspNetCore.MultiTenancy" />
@ -48,6 +47,7 @@
<PackageReference Include="Volo.Abp.IdentityServer.EntityFrameworkCore" /> <PackageReference Include="Volo.Abp.IdentityServer.EntityFrameworkCore" />
<PackageReference Include="Volo.Abp.FeatureManagement.EntityFrameworkCore" /> <PackageReference Include="Volo.Abp.FeatureManagement.EntityFrameworkCore" />
<PackageReference Include="Volo.Abp.SettingManagement.EntityFrameworkCore" /> <PackageReference Include="Volo.Abp.SettingManagement.EntityFrameworkCore" />
<PackageReference Include="Volo.Abp.Swashbuckle" />
<PackageReference Include="Volo.Abp.PermissionManagement.EntityFrameworkCore" /> <PackageReference Include="Volo.Abp.PermissionManagement.EntityFrameworkCore" />
</ItemGroup> </ItemGroup>

5
aspnet-core/services/LY.MicroService.IdentityServer.HttpApi.Host/appsettings.Development.json

@ -11,7 +11,7 @@
}, },
"App": { "App": {
"ShowPii": true, "ShowPii": true,
"CorsOrigins": "http://127.0.0.1:3100", "CorsOrigins": [ "http://127.0.0.1:5666" ],
"Urls": { "Urls": {
"Applications": { "Applications": {
"MVC": { "MVC": {
@ -92,7 +92,8 @@
"Authority": "http://127.0.0.1:44385/", "Authority": "http://127.0.0.1:44385/",
"Audience": "lingyun-abp-application", "Audience": "lingyun-abp-application",
"MapInboundClaims": false, "MapInboundClaims": false,
"RequireHttpsMetadata": false "RequireHttpsMetadata": false,
"SwaggerClientId": "vue-oauth-client"
}, },
"AuditLogging": { "AuditLogging": {
"Elasticsearch": { "Elasticsearch": {

16
aspnet-core/services/LY.MicroService.IdentityServer/IdentityServerModule.Configure.cs

@ -383,12 +383,18 @@ public partial class IdentityServerModule
{ {
options.AddDefaultPolicy(builder => options.AddDefaultPolicy(builder =>
{ {
var corsOrigins = configuration.GetSection("App:CorsOrigins").Get<List<string>>();
if (corsOrigins == null || corsOrigins.Count == 0)
{
corsOrigins = configuration["App:CorsOrigins"]?
.Split(",", StringSplitOptions.RemoveEmptyEntries)
.Select(o => o.RemovePostFix("/"))
.ToList() ?? new List<string>();
}
builder builder
.WithOrigins( .WithOrigins(corsOrigins
configuration["App:CorsOrigins"] .Select(o => o.RemovePostFix("/"))
.Split(",", StringSplitOptions.RemoveEmptyEntries) .ToArray()
.Select(o => o.RemovePostFix("/"))
.ToArray()
) )
.WithAbpExposedHeaders() .WithAbpExposedHeaders()
.WithAbpWrapExposedHeaders() .WithAbpWrapExposedHeaders()

13
aspnet-core/services/LY.MicroService.IdentityServer/appsettings.Development.json

@ -10,7 +10,18 @@
"configCacheEncrypt": true "configCacheEncrypt": true
}, },
"App": { "App": {
"CorsOrigins": "http://127.0.0.1:3100", "CorsOrigins": [
"http://127.0.0.1:5666",
"http://127.0.0.1:30010",
"http://127.0.0.1:30015",
"http://127.0.0.1:30020",
"http://127.0.0.1:30025",
"http://127.0.0.1:30030",
"http://127.0.0.1:30040",
"http://127.0.0.1:30045",
"http://127.0.0.1:30050",
"http://127.0.0.1:30060"
],
"Urls": { "Urls": {
"Applications": { "Applications": {
"MVC": { "MVC": {

6
aspnet-core/services/LY.MicroService.LocalizationManagement.HttpApi.Host/LY.MicroService.LocalizationManagement.HttpApi.Host.csproj

@ -16,10 +16,6 @@
<PackageReference Include="DotNetCore.CAP.RabbitMQ" /> <PackageReference Include="DotNetCore.CAP.RabbitMQ" />
<PackageReference Include="DistributedLock.Redis" /> <PackageReference Include="DistributedLock.Redis" />
<PackageReference Include="Microsoft.AspNetCore.DataProtection.StackExchangeRedis" /> <PackageReference Include="Microsoft.AspNetCore.DataProtection.StackExchangeRedis" />
<!--<PackageReference Include="Microsoft.EntityFrameworkCore.Design" Version="7.0.5">
<PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference>-->
<PackageReference Include="Serilog.AspNetCore" /> <PackageReference Include="Serilog.AspNetCore" />
<PackageReference Include="Serilog.Enrichers.Environment" /> <PackageReference Include="Serilog.Enrichers.Environment" />
<PackageReference Include="Serilog.Enrichers.Assembly" /> <PackageReference Include="Serilog.Enrichers.Assembly" />
@ -28,7 +24,6 @@
<PackageReference Include="Serilog.Settings.Configuration" /> <PackageReference Include="Serilog.Settings.Configuration" />
<PackageReference Include="Serilog.Sinks.Elasticsearch" /> <PackageReference Include="Serilog.Sinks.Elasticsearch" />
<PackageReference Include="Serilog.Sinks.File" /> <PackageReference Include="Serilog.Sinks.File" />
<PackageReference Include="Swashbuckle.AspNetCore" />
<PackageReference Include="Volo.Abp.AspNetCore.Serilog" /> <PackageReference Include="Volo.Abp.AspNetCore.Serilog" />
<PackageReference Include="Volo.Abp.Caching.StackExchangeRedis" /> <PackageReference Include="Volo.Abp.Caching.StackExchangeRedis" />
<PackageReference Include="Volo.Abp.AspNetCore.MultiTenancy" /> <PackageReference Include="Volo.Abp.AspNetCore.MultiTenancy" />
@ -38,6 +33,7 @@
<PackageReference Include="Volo.Abp.Http.Client" /> <PackageReference Include="Volo.Abp.Http.Client" />
<PackageReference Include="Volo.Abp.FeatureManagement.EntityFrameworkCore" /> <PackageReference Include="Volo.Abp.FeatureManagement.EntityFrameworkCore" />
<PackageReference Include="Volo.Abp.SettingManagement.EntityFrameworkCore" /> <PackageReference Include="Volo.Abp.SettingManagement.EntityFrameworkCore" />
<PackageReference Include="Volo.Abp.Swashbuckle" />
<PackageReference Include="Volo.Abp.PermissionManagement.EntityFrameworkCore" /> <PackageReference Include="Volo.Abp.PermissionManagement.EntityFrameworkCore" />
</ItemGroup> </ItemGroup>

41
aspnet-core/services/LY.MicroService.LocalizationManagement.HttpApi.Host/LocalizationManagementHttpApiHostModule.Configure.cs

@ -235,13 +235,32 @@ public partial class LocalizationManagementHttpApiHostModule
}); });
} }
private void ConfigureSwagger(IServiceCollection services) private void ConfigureSwagger(IServiceCollection services, IConfiguration configuration)
{ {
// Swagger // Swagger
services.AddSwaggerGen( services.AddAbpSwaggerGenWithOAuth(
configuration["AuthServer:Authority"],
new Dictionary<string, string>
{
{ configuration["AuthServer:Audience"], "Localization Service API"}
},
options => options =>
{ {
options.SwaggerDoc("v1", new OpenApiInfo { Title = "Localization Management API", Version = "v1" }); options.SwaggerDoc("v1", new OpenApiInfo
{
Title = "Localization Service API", Version = "v1",
Contact = new OpenApiContact
{
Name = "colin",
Email = "colin.in@foxmail.com",
Url = new Uri("https://github.com/colinin")
},
License = new OpenApiLicense
{
Name = "MIT",
Url = new Uri("https://github.com/colinin/abp-next-admin/blob/master/LICENSE")
}
});
options.DocInclusionPredicate((docName, description) => true); options.DocInclusionPredicate((docName, description) => true);
options.CustomSchemaIds(type => type.FullName); options.CustomSchemaIds(type => type.FullName);
options.AddSecurityDefinition("Bearer", new OpenApiSecurityScheme options.AddSecurityDefinition("Bearer", new OpenApiSecurityScheme
@ -300,12 +319,18 @@ public partial class LocalizationManagementHttpApiHostModule
{ {
options.AddDefaultPolicy(builder => options.AddDefaultPolicy(builder =>
{ {
var corsOrigins = configuration.GetSection("App:CorsOrigins").Get<List<string>>();
if (corsOrigins == null || corsOrigins.Count == 0)
{
corsOrigins = configuration["App:CorsOrigins"]?
.Split(",", StringSplitOptions.RemoveEmptyEntries)
.Select(o => o.RemovePostFix("/"))
.ToList() ?? new List<string>();
}
builder builder
.WithOrigins( .WithOrigins(corsOrigins
configuration["App:CorsOrigins"] .Select(o => o.RemovePostFix("/"))
.Split(",", StringSplitOptions.RemoveEmptyEntries) .ToArray()
.Select(o => o.RemovePostFix("/"))
.ToArray()
) )
.WithAbpExposedHeaders() .WithAbpExposedHeaders()
.WithAbpWrapExposedHeaders() .WithAbpWrapExposedHeaders()

12
aspnet-core/services/LY.MicroService.LocalizationManagement.HttpApi.Host/LocalizationManagementHttpApiHostModule.cs

@ -30,6 +30,7 @@ using Volo.Abp.Http.Client;
using Volo.Abp.Modularity; using Volo.Abp.Modularity;
using Volo.Abp.PermissionManagement.EntityFrameworkCore; using Volo.Abp.PermissionManagement.EntityFrameworkCore;
using Volo.Abp.SettingManagement.EntityFrameworkCore; using Volo.Abp.SettingManagement.EntityFrameworkCore;
using Volo.Abp.Swashbuckle;
namespace LY.MicroService.LocalizationManagement; namespace LY.MicroService.LocalizationManagement;
@ -61,6 +62,7 @@ namespace LY.MicroService.LocalizationManagement;
typeof(AbpEmailingPlatformModule), typeof(AbpEmailingPlatformModule),
typeof(AbpAspNetCoreMvcWrapperModule), typeof(AbpAspNetCoreMvcWrapperModule),
typeof(AbpAspNetCoreHttpOverridesModule), typeof(AbpAspNetCoreHttpOverridesModule),
typeof(AbpSwashbuckleModule),
typeof(AbpAutofacModule) typeof(AbpAutofacModule)
)] )]
public partial class LocalizationManagementHttpApiHostModule : AbpModule public partial class LocalizationManagementHttpApiHostModule : AbpModule
@ -90,11 +92,11 @@ public partial class LocalizationManagementHttpApiHostModule : AbpModule
ConfigureCaching(configuration); ConfigureCaching(configuration);
ConfigureIdentity(configuration); ConfigureIdentity(configuration);
ConfigureAuditing(configuration); ConfigureAuditing(configuration);
ConfigureSwagger(context.Services);
ConfigureMultiTenancy(configuration); ConfigureMultiTenancy(configuration);
ConfigureJsonSerializer(configuration); ConfigureJsonSerializer(configuration);
ConfigureMvc(context.Services, configuration); ConfigureMvc(context.Services, configuration);
ConfigureCors(context.Services, configuration); ConfigureCors(context.Services, configuration);
ConfigureSwagger(context.Services, configuration);
ConfigureDistributedLocking(context.Services, configuration); ConfigureDistributedLocking(context.Services, configuration);
ConfigureSeedWorker(context.Services, hostingEnvironment.IsDevelopment()); ConfigureSeedWorker(context.Services, hostingEnvironment.IsDevelopment());
ConfigureSecurity(context.Services, configuration, hostingEnvironment.IsDevelopment()); ConfigureSecurity(context.Services, configuration, hostingEnvironment.IsDevelopment());
@ -129,9 +131,13 @@ public partial class LocalizationManagementHttpApiHostModule : AbpModule
// Swagger // Swagger
app.UseSwagger(); app.UseSwagger();
// Swagger可视化界面 // Swagger可视化界面
app.UseSwaggerUI(options => app.UseAbpSwaggerUI(options =>
{ {
options.SwaggerEndpoint("/swagger/v1/swagger.json", "Support Localization Management API"); options.SwaggerEndpoint("/swagger/v1/swagger.json", "Support Localization Service API");
var configuration = context.GetConfiguration();
options.OAuthClientId(configuration["AuthServer:SwaggerClientId"]);
options.OAuthScopes(configuration["AuthServer:Audience"]);
}); });
// 审计日志 // 审计日志
app.UseAuditing(); app.UseAuditing();

5
aspnet-core/services/LY.MicroService.LocalizationManagement.HttpApi.Host/appsettings.Development.json

@ -10,7 +10,7 @@
"configCacheEncrypt": true "configCacheEncrypt": true
}, },
"App": { "App": {
"CorsOrigins": "http://127.0.0.1:3100", "CorsOrigins": [ "http://127.0.0.1:5666" ],
"ShowPii": true, "ShowPii": true,
"RefreshClaimsUrl": "http://127.0.0.1:30015" "RefreshClaimsUrl": "http://127.0.0.1:30015"
}, },
@ -72,7 +72,8 @@
"Authority": "http://127.0.0.1:44385/", "Authority": "http://127.0.0.1:44385/",
"Audience": "lingyun-abp-application", "Audience": "lingyun-abp-application",
"MapInboundClaims": false, "MapInboundClaims": false,
"RequireHttpsMetadata": false "RequireHttpsMetadata": false,
"SwaggerClientId": "vue-oauth-client"
}, },
"AuditLogging": { "AuditLogging": {
"Elasticsearch": { "Elasticsearch": {

6
aspnet-core/services/LY.MicroService.PlatformManagement.HttpApi.Host/LY.MicroService.PlatformManagement.HttpApi.Host.csproj

@ -16,10 +16,6 @@
<PackageReference Include="DotNetCore.CAP.RabbitMQ" /> <PackageReference Include="DotNetCore.CAP.RabbitMQ" />
<PackageReference Include="DistributedLock.Redis" /> <PackageReference Include="DistributedLock.Redis" />
<PackageReference Include="Microsoft.AspNetCore.DataProtection.StackExchangeRedis" /> <PackageReference Include="Microsoft.AspNetCore.DataProtection.StackExchangeRedis" />
<!--<PackageReference Include="Microsoft.EntityFrameworkCore.Design" Version="7.0.5">
<PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference>-->
<PackageReference Include="Serilog.AspNetCore" /> <PackageReference Include="Serilog.AspNetCore" />
<PackageReference Include="Serilog.Enrichers.Environment" /> <PackageReference Include="Serilog.Enrichers.Environment" />
<PackageReference Include="Serilog.Enrichers.Assembly" /> <PackageReference Include="Serilog.Enrichers.Assembly" />
@ -28,7 +24,6 @@
<PackageReference Include="Serilog.Settings.Configuration" /> <PackageReference Include="Serilog.Settings.Configuration" />
<PackageReference Include="Serilog.Sinks.Elasticsearch" /> <PackageReference Include="Serilog.Sinks.Elasticsearch" />
<PackageReference Include="Serilog.Sinks.File" /> <PackageReference Include="Serilog.Sinks.File" />
<PackageReference Include="Swashbuckle.AspNetCore" />
<PackageReference Include="Volo.Abp.AspNetCore.Serilog" /> <PackageReference Include="Volo.Abp.AspNetCore.Serilog" />
<PackageReference Include="Volo.Abp.Caching.StackExchangeRedis" /> <PackageReference Include="Volo.Abp.Caching.StackExchangeRedis" />
<PackageReference Include="Volo.Abp.AspNetCore.MultiTenancy" /> <PackageReference Include="Volo.Abp.AspNetCore.MultiTenancy" />
@ -42,6 +37,7 @@
<PackageReference Include="Volo.Abp.EntityFrameworkCore.MySQL" /> <PackageReference Include="Volo.Abp.EntityFrameworkCore.MySQL" />
<PackageReference Include="Volo.Abp.FeatureManagement.EntityFrameworkCore" /> <PackageReference Include="Volo.Abp.FeatureManagement.EntityFrameworkCore" />
<PackageReference Include="Volo.Abp.SettingManagement.EntityFrameworkCore" /> <PackageReference Include="Volo.Abp.SettingManagement.EntityFrameworkCore" />
<PackageReference Include="Volo.Abp.Swashbuckle" />
<PackageReference Include="Volo.Abp.PermissionManagement.EntityFrameworkCore" /> <PackageReference Include="Volo.Abp.PermissionManagement.EntityFrameworkCore" />
</ItemGroup> </ItemGroup>

41
aspnet-core/services/LY.MicroService.PlatformManagement.HttpApi.Host/PlatformManagementHttpApiHostModule.Configure.cs

@ -312,13 +312,32 @@ public partial class PlatformManagementHttpApiHostModule
}); });
} }
private void ConfigureSwagger(IServiceCollection services) private void ConfigureSwagger(IServiceCollection services, IConfiguration configuration)
{ {
// Swagger // Swagger
services.AddSwaggerGen( services.AddAbpSwaggerGenWithOAuth(
configuration["AuthServer:Authority"],
new Dictionary<string, string>
{
{ configuration["AuthServer:Audience"], "Platform Service API"}
},
options => options =>
{ {
options.SwaggerDoc("v1", new OpenApiInfo { Title = "Platform API", Version = "v1" }); options.SwaggerDoc("v1", new OpenApiInfo
{
Title = "Platform Service API", Version = "v1",
Contact = new OpenApiContact
{
Name = "colin",
Email = "colin.in@foxmail.com",
Url = new Uri("https://github.com/colinin")
},
License = new OpenApiLicense
{
Name = "MIT",
Url = new Uri("https://github.com/colinin/abp-next-admin/blob/master/LICENSE")
}
});
options.DocInclusionPredicate((docName, description) => true); options.DocInclusionPredicate((docName, description) => true);
options.CustomSchemaIds(type => type.FullName); options.CustomSchemaIds(type => type.FullName);
options.AddSecurityDefinition("Bearer", new OpenApiSecurityScheme options.AddSecurityDefinition("Bearer", new OpenApiSecurityScheme
@ -377,12 +396,18 @@ public partial class PlatformManagementHttpApiHostModule
{ {
options.AddDefaultPolicy(builder => options.AddDefaultPolicy(builder =>
{ {
var corsOrigins = configuration.GetSection("App:CorsOrigins").Get<List<string>>();
if (corsOrigins == null || corsOrigins.Count == 0)
{
corsOrigins = configuration["App:CorsOrigins"]?
.Split(",", StringSplitOptions.RemoveEmptyEntries)
.Select(o => o.RemovePostFix("/"))
.ToList() ?? new List<string>();
}
builder builder
.WithOrigins( .WithOrigins(corsOrigins
configuration["App:CorsOrigins"] .Select(o => o.RemovePostFix("/"))
.Split(",", StringSplitOptions.RemoveEmptyEntries) .ToArray()
.Select(o => o.RemovePostFix("/"))
.ToArray()
) )
.WithAbpExposedHeaders() .WithAbpExposedHeaders()
.WithAbpWrapExposedHeaders() .WithAbpWrapExposedHeaders()

12
aspnet-core/services/LY.MicroService.PlatformManagement.HttpApi.Host/PlatformManagementHttpApiHostModule.cs

@ -52,6 +52,7 @@ using Volo.Abp.MailKit;
using Volo.Abp.Modularity; using Volo.Abp.Modularity;
using Volo.Abp.PermissionManagement.EntityFrameworkCore; using Volo.Abp.PermissionManagement.EntityFrameworkCore;
using Volo.Abp.SettingManagement.EntityFrameworkCore; using Volo.Abp.SettingManagement.EntityFrameworkCore;
using Volo.Abp.Swashbuckle;
using Volo.Abp.Threading; using Volo.Abp.Threading;
namespace LY.MicroService.PlatformManagement; namespace LY.MicroService.PlatformManagement;
@ -103,6 +104,7 @@ namespace LY.MicroService.PlatformManagement;
typeof(AbpAspNetCoreMvcWrapperModule), typeof(AbpAspNetCoreMvcWrapperModule),
typeof(AbpClaimsMappingModule), typeof(AbpClaimsMappingModule),
typeof(AbpAspNetCoreHttpOverridesModule), typeof(AbpAspNetCoreHttpOverridesModule),
typeof(AbpSwashbuckleModule),
typeof(AbpAutofacModule) typeof(AbpAutofacModule)
)] )]
public partial class PlatformManagementHttpApiHostModule : AbpModule public partial class PlatformManagementHttpApiHostModule : AbpModule
@ -133,11 +135,11 @@ public partial class PlatformManagementHttpApiHostModule : AbpModule
ConfigureCaching(configuration); ConfigureCaching(configuration);
ConfigureIdentity(configuration); ConfigureIdentity(configuration);
ConfigureAuditing(configuration); ConfigureAuditing(configuration);
ConfigureSwagger(context.Services);
ConfigureMultiTenancy(configuration); ConfigureMultiTenancy(configuration);
ConfigureJsonSerializer(configuration); ConfigureJsonSerializer(configuration);
ConfigureMvc(context.Services, configuration); ConfigureMvc(context.Services, configuration);
ConfigureCors(context.Services, configuration); ConfigureCors(context.Services, configuration);
ConfigureSwagger(context.Services, configuration);
ConfigureOssManagement(context.Services, configuration); ConfigureOssManagement(context.Services, configuration);
ConfigureDistributedLocking(context.Services, configuration); ConfigureDistributedLocking(context.Services, configuration);
ConfigureSeedWorker(context.Services, hostingEnvironment.IsDevelopment()); ConfigureSeedWorker(context.Services, hostingEnvironment.IsDevelopment());
@ -191,9 +193,13 @@ public partial class PlatformManagementHttpApiHostModule : AbpModule
// Swagger // Swagger
app.UseSwagger(); app.UseSwagger();
// Swagger可视化界面 // Swagger可视化界面
app.UseSwaggerUI(options => app.UseAbpSwaggerUI(options =>
{ {
options.SwaggerEndpoint("/swagger/v1/swagger.json", "Support Platform API"); options.SwaggerEndpoint("/swagger/v1/swagger.json", "Support Platform Service API");
var configuration = context.GetConfiguration();
options.OAuthClientId(configuration["AuthServer:SwaggerClientId"]);
options.OAuthScopes(configuration["AuthServer:Audience"]);
}); });
// 审计日志 // 审计日志
app.UseAuditing(); app.UseAuditing();

5
aspnet-core/services/LY.MicroService.PlatformManagement.HttpApi.Host/appsettings.Development.json

@ -17,7 +17,7 @@
"127.0.0.1" "127.0.0.1"
] ]
}, },
"CorsOrigins": "http://127.0.0.1:3100", "CorsOrigins": [ "http://127.0.0.1:5666" ],
"ShowPii": true, "ShowPii": true,
"RefreshClaimsUrl": "http://127.0.0.1:30015" "RefreshClaimsUrl": "http://127.0.0.1:30015"
}, },
@ -97,7 +97,8 @@
"Authority": "http://127.0.0.1:44385/", "Authority": "http://127.0.0.1:44385/",
"Audience": "lingyun-abp-application", "Audience": "lingyun-abp-application",
"MapInboundClaims": false, "MapInboundClaims": false,
"RequireHttpsMetadata": false "RequireHttpsMetadata": false,
"SwaggerClientId": "vue-oauth-client"
}, },
"AuditLogging": { "AuditLogging": {
"Elasticsearch": { "Elasticsearch": {

6
aspnet-core/services/LY.MicroService.RealtimeMessage.HttpApi.Host/LY.MicroService.RealtimeMessage.HttpApi.Host.csproj

@ -20,10 +20,6 @@
<PackageReference Include="DotNetCore.CAP.RabbitMQ" /> <PackageReference Include="DotNetCore.CAP.RabbitMQ" />
<PackageReference Include="DistributedLock.Redis" /> <PackageReference Include="DistributedLock.Redis" />
<PackageReference Include="Microsoft.AspNetCore.DataProtection.StackExchangeRedis" /> <PackageReference Include="Microsoft.AspNetCore.DataProtection.StackExchangeRedis" />
<!--<PackageReference Include="Microsoft.EntityFrameworkCore.Design" Version="7.0.5">
<PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference>-->
<PackageReference Include="Microsoft.AspNetCore.SignalR.StackExchangeRedis" /> <PackageReference Include="Microsoft.AspNetCore.SignalR.StackExchangeRedis" />
<PackageReference Include="Quartz.Serialization.Json" /> <PackageReference Include="Quartz.Serialization.Json" />
<PackageReference Include="Serilog.AspNetCore" /> <PackageReference Include="Serilog.AspNetCore" />
@ -34,7 +30,6 @@
<PackageReference Include="Serilog.Settings.Configuration" /> <PackageReference Include="Serilog.Settings.Configuration" />
<PackageReference Include="Serilog.Sinks.Elasticsearch" /> <PackageReference Include="Serilog.Sinks.Elasticsearch" />
<PackageReference Include="Serilog.Sinks.File" /> <PackageReference Include="Serilog.Sinks.File" />
<PackageReference Include="Swashbuckle.AspNetCore" />
<PackageReference Include="Volo.Abp.AspNetCore.Serilog" /> <PackageReference Include="Volo.Abp.AspNetCore.Serilog" />
<PackageReference Include="Volo.Abp.Caching.StackExchangeRedis" /> <PackageReference Include="Volo.Abp.Caching.StackExchangeRedis" />
<PackageReference Include="Volo.Abp.AspNetCore.MultiTenancy" /> <PackageReference Include="Volo.Abp.AspNetCore.MultiTenancy" />
@ -45,6 +40,7 @@
<PackageReference Include="Volo.Abp.Identity.EntityFrameworkCore" /> <PackageReference Include="Volo.Abp.Identity.EntityFrameworkCore" />
<PackageReference Include="Volo.Abp.FeatureManagement.EntityFrameworkCore" /> <PackageReference Include="Volo.Abp.FeatureManagement.EntityFrameworkCore" />
<PackageReference Include="Volo.Abp.SettingManagement.EntityFrameworkCore" /> <PackageReference Include="Volo.Abp.SettingManagement.EntityFrameworkCore" />
<PackageReference Include="Volo.Abp.Swashbuckle" />
<PackageReference Include="Volo.Abp.PermissionManagement.EntityFrameworkCore" /> <PackageReference Include="Volo.Abp.PermissionManagement.EntityFrameworkCore" />
</ItemGroup> </ItemGroup>

41
aspnet-core/services/LY.MicroService.RealtimeMessage.HttpApi.Host/RealtimeMessageHttpApiHostModule.Configure.cs

@ -334,13 +334,32 @@ public partial class RealtimeMessageHttpApiHostModule
}); });
} }
private void ConfigureSwagger(IServiceCollection services) private void ConfigureSwagger(IServiceCollection services, IConfiguration configuration)
{ {
// Swagger // Swagger
services.AddSwaggerGen( services.AddAbpSwaggerGenWithOAuth(
configuration["AuthServer:Authority"],
new Dictionary<string, string>
{
{ configuration["AuthServer:Audience"], "Message Service API"}
},
options => options =>
{ {
options.SwaggerDoc("v1", new OpenApiInfo { Title = "Realtime Message API", Version = "v1" }); options.SwaggerDoc("v1", new OpenApiInfo
{
Title = "Message Service API", Version = "v1",
Contact = new OpenApiContact
{
Name = "colin",
Email = "colin.in@foxmail.com",
Url = new Uri("https://github.com/colinin")
},
License = new OpenApiLicense
{
Name = "MIT",
Url = new Uri("https://github.com/colinin/abp-next-admin/blob/master/LICENSE")
}
});
options.DocInclusionPredicate((docName, description) => true); options.DocInclusionPredicate((docName, description) => true);
options.CustomSchemaIds(type => type.FullName); options.CustomSchemaIds(type => type.FullName);
options.AddSecurityDefinition("Bearer", new OpenApiSecurityScheme options.AddSecurityDefinition("Bearer", new OpenApiSecurityScheme
@ -372,12 +391,18 @@ public partial class RealtimeMessageHttpApiHostModule
{ {
options.AddDefaultPolicy(builder => options.AddDefaultPolicy(builder =>
{ {
var corsOrigins = configuration.GetSection("App:CorsOrigins").Get<List<string>>();
if (corsOrigins == null || corsOrigins.Count == 0)
{
corsOrigins = configuration["App:CorsOrigins"]?
.Split(",", StringSplitOptions.RemoveEmptyEntries)
.Select(o => o.RemovePostFix("/"))
.ToList() ?? new List<string>();
}
builder builder
.WithOrigins( .WithOrigins(corsOrigins
configuration["App:CorsOrigins"] .Select(o => o.RemovePostFix("/"))
.Split(",", StringSplitOptions.RemoveEmptyEntries) .ToArray()
.Select(o => o.RemovePostFix("/"))
.ToArray()
) )
.WithAbpExposedHeaders() .WithAbpExposedHeaders()
.WithAbpWrapExposedHeaders() .WithAbpWrapExposedHeaders()

12
aspnet-core/services/LY.MicroService.RealtimeMessage.HttpApi.Host/RealtimeMessageHttpApiHostModule.cs

@ -60,6 +60,7 @@ using Volo.Abp.Http.Client;
using Volo.Abp.Modularity; using Volo.Abp.Modularity;
using Volo.Abp.PermissionManagement.EntityFrameworkCore; using Volo.Abp.PermissionManagement.EntityFrameworkCore;
using Volo.Abp.SettingManagement.EntityFrameworkCore; using Volo.Abp.SettingManagement.EntityFrameworkCore;
using Volo.Abp.Swashbuckle;
namespace LY.MicroService.RealtimeMessage; namespace LY.MicroService.RealtimeMessage;
@ -124,6 +125,7 @@ namespace LY.MicroService.RealtimeMessage;
typeof(AbpTelemetrySkyWalkingModule), typeof(AbpTelemetrySkyWalkingModule),
typeof(AbpAspNetCoreMvcWrapperModule), typeof(AbpAspNetCoreMvcWrapperModule),
typeof(AbpAspNetCoreHttpOverridesModule), typeof(AbpAspNetCoreHttpOverridesModule),
typeof(AbpSwashbuckleModule),
typeof(AbpAutofacModule) typeof(AbpAutofacModule)
)] )]
public partial class RealtimeMessageHttpApiHostModule : AbpModule public partial class RealtimeMessageHttpApiHostModule : AbpModule
@ -160,9 +162,9 @@ public partial class RealtimeMessageHttpApiHostModule : AbpModule
ConfigureMultiTenancy(configuration); ConfigureMultiTenancy(configuration);
ConfigureJsonSerializer(configuration); ConfigureJsonSerializer(configuration);
ConfigureBackgroundTasks(configuration); ConfigureBackgroundTasks(configuration);
ConfigureSwagger(context.Services);
ConfigureMvc(context.Services, configuration); ConfigureMvc(context.Services, configuration);
ConfigureCors(context.Services, configuration); ConfigureCors(context.Services, configuration);
ConfigureSwagger(context.Services, configuration);
ConfigureDistributedLocking(context.Services, configuration); ConfigureDistributedLocking(context.Services, configuration);
ConfigureSeedWorker(context.Services, hostingEnvironment.IsDevelopment()); ConfigureSeedWorker(context.Services, hostingEnvironment.IsDevelopment());
ConfigureSecurity(context.Services, configuration, hostingEnvironment.IsDevelopment()); ConfigureSecurity(context.Services, configuration, hostingEnvironment.IsDevelopment());
@ -195,9 +197,13 @@ public partial class RealtimeMessageHttpApiHostModule : AbpModule
// Swagger // Swagger
app.UseSwagger(); app.UseSwagger();
// Swagger可视化界面 // Swagger可视化界面
app.UseSwaggerUI(options => app.UseAbpSwaggerUI(options =>
{ {
options.SwaggerEndpoint("/swagger/v1/swagger.json", "Support Realtime Message API"); options.SwaggerEndpoint("/swagger/v1/swagger.json", "Support Message Service API");
var configuration = context.GetConfiguration();
options.OAuthClientId(configuration["AuthServer:SwaggerClientId"]);
options.OAuthScopes(configuration["AuthServer:Audience"]);
}); });
// 审计日志 // 审计日志
app.UseAuditing(); app.UseAuditing();

5
aspnet-core/services/LY.MicroService.RealtimeMessage.HttpApi.Host/appsettings.Development.json

@ -10,7 +10,7 @@
"configCacheEncrypt": true "configCacheEncrypt": true
}, },
"App": { "App": {
"CorsOrigins": "http://127.0.0.1:3100", "CorsOrigins": [ "http://127.0.0.1:5666" ],
"Forwarded": { "Forwarded": {
"ForwardedHeaders": 5, "ForwardedHeaders": 5,
"KnownProxies": [ "KnownProxies": [
@ -78,7 +78,8 @@
"Authority": "http://127.0.0.1:44385/", "Authority": "http://127.0.0.1:44385/",
"Audience": "lingyun-abp-application", "Audience": "lingyun-abp-application",
"MapInboundClaims": false, "MapInboundClaims": false,
"RequireHttpsMetadata": false "RequireHttpsMetadata": false,
"SwaggerClientId": "vue-oauth-client"
}, },
"Quartz": { "Quartz": {
"UsePersistentStore": false, "UsePersistentStore": false,

41
aspnet-core/services/LY.MicroService.TaskManagement.HttpApi.Host/TaskManagementHttpApiHostModule.Configure.cs

@ -202,12 +202,18 @@ public partial class TaskManagementHttpApiHostModule
{ {
options.AddDefaultPolicy(builder => options.AddDefaultPolicy(builder =>
{ {
var corsOrigins = configuration.GetSection("App:CorsOrigins").Get<List<string>>();
if (corsOrigins == null || corsOrigins.Count == 0)
{
corsOrigins = configuration["App:CorsOrigins"]?
.Split(",", StringSplitOptions.RemoveEmptyEntries)
.Select(o => o.RemovePostFix("/"))
.ToList() ?? new List<string>();
}
builder builder
.WithOrigins( .WithOrigins(corsOrigins
configuration["App:CorsOrigins"] .Select(o => o.RemovePostFix("/"))
.Split(",", StringSplitOptions.RemoveEmptyEntries) .ToArray()
.Select(o => o.RemovePostFix("/"))
.ToArray()
) )
.WithAbpExposedHeaders() .WithAbpExposedHeaders()
.WithAbpWrapExposedHeaders() .WithAbpWrapExposedHeaders()
@ -312,13 +318,32 @@ public partial class TaskManagementHttpApiHostModule
}); });
} }
private void ConfigureSwagger(IServiceCollection services) private void ConfigureSwagger(IServiceCollection services, IConfiguration configuration)
{ {
// Swagger // Swagger
services.AddSwaggerGen( services.AddAbpSwaggerGenWithOAuth(
configuration["AuthServer:Authority"],
new Dictionary<string, string>
{
{ configuration["AuthServer:Audience"], "Task Service API"}
},
options => options =>
{ {
options.SwaggerDoc("v1", new OpenApiInfo { Title = "TaskManagement API", Version = "v1" }); options.SwaggerDoc("v1", new OpenApiInfo
{
Title = "Task Service API", Version = "v1",
Contact = new OpenApiContact
{
Name = "colin",
Email = "colin.in@foxmail.com",
Url = new Uri("https://github.com/colinin")
},
License = new OpenApiLicense
{
Name = "MIT",
Url = new Uri("https://github.com/colinin/abp-next-admin/blob/master/LICENSE")
}
});
options.DocInclusionPredicate((docName, description) => true); options.DocInclusionPredicate((docName, description) => true);
options.CustomSchemaIds(type => type.FullName); options.CustomSchemaIds(type => type.FullName);
options.AddSecurityDefinition("Bearer", new OpenApiSecurityScheme options.AddSecurityDefinition("Bearer", new OpenApiSecurityScheme

7
aspnet-core/services/LY.MicroService.TaskManagement.HttpApi.Host/TaskManagementHttpApiHostModule.cs

@ -118,10 +118,10 @@ public partial class TaskManagementHttpApiHostModule : AbpModule
ConfigureAuditing(configuration); ConfigureAuditing(configuration);
ConfigureIdentity(configuration); ConfigureIdentity(configuration);
ConfigureMultiTenancy(configuration); ConfigureMultiTenancy(configuration);
ConfigureSwagger(context.Services);
ConfigureJsonSerializer(configuration); ConfigureJsonSerializer(configuration);
ConfigureMvc(context.Services, configuration); ConfigureMvc(context.Services, configuration);
ConfigureCors(context.Services, configuration); ConfigureCors(context.Services, configuration);
ConfigureSwagger(context.Services, configuration);
ConfigureDistributedLock(context.Services, configuration); ConfigureDistributedLock(context.Services, configuration);
ConfigureSecurity(context.Services, configuration, hostingEnvironment.IsDevelopment()); ConfigureSecurity(context.Services, configuration, hostingEnvironment.IsDevelopment());
} }
@ -145,12 +145,11 @@ public partial class TaskManagementHttpApiHostModule : AbpModule
app.UseSwagger(); app.UseSwagger();
app.UseAbpSwaggerUI(options => app.UseAbpSwaggerUI(options =>
{ {
options.SwaggerEndpoint("/swagger/v1/swagger.json", "Support Task Management API"); options.SwaggerEndpoint("/swagger/v1/swagger.json", "Support Task Service API");
var configuration = context.GetConfiguration(); var configuration = context.GetConfiguration();
options.OAuthClientId(configuration["AuthServer:SwaggerClientId"]); options.OAuthClientId(configuration["AuthServer:SwaggerClientId"]);
options.OAuthClientSecret(configuration["AuthServer:SwaggerClientSecret"]); options.OAuthScopes(configuration["AuthServer:Audience"]);
options.OAuthScopes(configuration["AuthServer:Scopes"]);
}); });
app.UseAuditing(); app.UseAuditing();
app.UseAbpSerilogEnrichers(); app.UseAbpSerilogEnrichers();

1
aspnet-core/services/LY.MicroService.TaskManagement.HttpApi.Host/appsettings.Development.json

@ -11,6 +11,7 @@
}, },
"App": { "App": {
"ShowPii": true, "ShowPii": true,
"CorsOrigins": [ "http://127.0.0.1:5666" ],
"RefreshClaimsUrl": "http://127.0.0.1:30015" "RefreshClaimsUrl": "http://127.0.0.1:30015"
}, },
"Auditing": { "Auditing": {

41
aspnet-core/services/LY.MicroService.WebhooksManagement.HttpApi.Host/WebhooksManagementHttpApiHostModule.Configure.cs

@ -308,13 +308,32 @@ public partial class WebhooksManagementHttpApiHostModule
}); });
} }
private void ConfigureSwagger(IServiceCollection services) private void ConfigureSwagger(IServiceCollection services, IConfiguration configuration)
{ {
// Swagger // Swagger
services.AddSwaggerGen( services.AddAbpSwaggerGenWithOAuth(
configuration["AuthServer:Authority"],
new Dictionary<string, string>
{
{ configuration["AuthServer:Audience"], "Webhook Service API"}
},
options => options =>
{ {
options.SwaggerDoc("v1", new OpenApiInfo { Title = "WebhooksManagement API", Version = "v1" }); options.SwaggerDoc("v1", new OpenApiInfo
{
Title = "Webhook Service API", Version = "v1",
Contact = new OpenApiContact
{
Name = "colin",
Email = "colin.in@foxmail.com",
Url = new Uri("https://github.com/colinin")
},
License = new OpenApiLicense
{
Name = "MIT",
Url = new Uri("https://github.com/colinin/abp-next-admin/blob/master/LICENSE")
}
});
options.DocInclusionPredicate((docName, description) => true); options.DocInclusionPredicate((docName, description) => true);
options.CustomSchemaIds(type => type.FullName); options.CustomSchemaIds(type => type.FullName);
options.AddSecurityDefinition("Bearer", new OpenApiSecurityScheme options.AddSecurityDefinition("Bearer", new OpenApiSecurityScheme
@ -410,12 +429,18 @@ public partial class WebhooksManagementHttpApiHostModule
{ {
options.AddDefaultPolicy(builder => options.AddDefaultPolicy(builder =>
{ {
var corsOrigins = configuration.GetSection("App:CorsOrigins").Get<List<string>>();
if (corsOrigins == null || corsOrigins.Count == 0)
{
corsOrigins = configuration["App:CorsOrigins"]?
.Split(",", StringSplitOptions.RemoveEmptyEntries)
.Select(o => o.RemovePostFix("/"))
.ToList() ?? new List<string>();
}
builder builder
.WithOrigins( .WithOrigins(corsOrigins
configuration["App:CorsOrigins"] .Select(o => o.RemovePostFix("/"))
.Split(",", StringSplitOptions.RemoveEmptyEntries) .ToArray()
.Select(o => o.RemovePostFix("/"))
.ToArray()
) )
.WithAbpExposedHeaders() .WithAbpExposedHeaders()
.WithAbpWrapExposedHeaders() .WithAbpWrapExposedHeaders()

7
aspnet-core/services/LY.MicroService.WebhooksManagement.HttpApi.Host/WebhooksManagementHttpApiHostModule.cs

@ -121,11 +121,11 @@ public partial class WebhooksManagementHttpApiHostModule : AbpModule
ConfigureAuditing(configuration); ConfigureAuditing(configuration);
ConfigureIdentity(configuration); ConfigureIdentity(configuration);
ConfigureMultiTenancy(configuration); ConfigureMultiTenancy(configuration);
ConfigureSwagger(context.Services);
ConfigureWebhooks(context.Services); ConfigureWebhooks(context.Services);
ConfigureJsonSerializer(configuration); ConfigureJsonSerializer(configuration);
ConfigureMvc(context.Services, configuration); ConfigureMvc(context.Services, configuration);
ConfigureCors(context.Services, configuration); ConfigureCors(context.Services, configuration);
ConfigureSwagger(context.Services, configuration);
ConfigureDistributedLock(context.Services, configuration); ConfigureDistributedLock(context.Services, configuration);
ConfigureBackgroundTasks(context.Services, configuration); ConfigureBackgroundTasks(context.Services, configuration);
ConfigureSeedWorker(context.Services, hostingEnvironment.IsDevelopment()); ConfigureSeedWorker(context.Services, hostingEnvironment.IsDevelopment());
@ -152,12 +152,11 @@ public partial class WebhooksManagementHttpApiHostModule : AbpModule
app.UseSwagger(); app.UseSwagger();
app.UseAbpSwaggerUI(options => app.UseAbpSwaggerUI(options =>
{ {
options.SwaggerEndpoint("/swagger/v1/swagger.json", "Support APP API"); options.SwaggerEndpoint("/swagger/v1/swagger.json", "Support Webhook Service API");
var configuration = context.GetConfiguration(); var configuration = context.GetConfiguration();
options.OAuthClientId(configuration["AuthServer:SwaggerClientId"]); options.OAuthClientId(configuration["AuthServer:SwaggerClientId"]);
options.OAuthClientSecret(configuration["AuthServer:SwaggerClientSecret"]); options.OAuthScopes(configuration["AuthServer:Audience"]);
options.OAuthScopes("WebhooksManagement");
}); });
app.UseAuditing(); app.UseAuditing();
app.UseAbpSerilogEnrichers(); app.UseAbpSerilogEnrichers();

4
aspnet-core/services/LY.MicroService.WebhooksManagement.HttpApi.Host/appsettings.Development.json

@ -11,6 +11,7 @@
}, },
"App": { "App": {
"ShowPii": true, "ShowPii": true,
"CorsOrigins": [ "http://127.0.0.1:5666" ],
"RefreshClaimsUrl": "http://127.0.0.1:30015" "RefreshClaimsUrl": "http://127.0.0.1:30015"
}, },
"Auditing": { "Auditing": {
@ -103,8 +104,7 @@
"Audience": "lingyun-abp-application", "Audience": "lingyun-abp-application",
"MapInboundClaims": false, "MapInboundClaims": false,
"RequireHttpsMetadata": false, "RequireHttpsMetadata": false,
"SwaggerClientId": "InternalServiceClient", "SwaggerClientId": "vue-oauth-client"
"SwaggerClientSecret": "1q2w3E*"
}, },
"Logging": { "Logging": {
"Serilog": { "Serilog": {

27
aspnet-core/services/LY.MicroService.WechatManagement.HttpApi.Host/WechatManagementHttpApiHostModule.Configure.cs

@ -256,15 +256,20 @@ public partial class WechatManagementHttpApiHostModule
}); });
} }
private void ConfigureSwagger(IServiceCollection services) private void ConfigureSwagger(IServiceCollection services, IConfiguration configuration)
{ {
// Swagger // Swagger
services.AddSwaggerGen( services.AddAbpSwaggerGenWithOAuth(
configuration["AuthServer:Authority"],
new Dictionary<string, string>
{
{ configuration["AuthServer:Audience"], "Wechat Service API"}
},
options => options =>
{ {
options.SwaggerDoc("v1", new OpenApiInfo options.SwaggerDoc("v1", new OpenApiInfo
{ {
Title = "WechatManagement API", Version = "v1", Title = "Wechat Service API", Version = "v1",
Contact = new OpenApiContact Contact = new OpenApiContact
{ {
Name = "colin", Name = "colin",
@ -360,12 +365,18 @@ public partial class WechatManagementHttpApiHostModule
{ {
options.AddDefaultPolicy(builder => options.AddDefaultPolicy(builder =>
{ {
var corsOrigins = configuration.GetSection("App:CorsOrigins").Get<List<string>>();
if (corsOrigins == null || corsOrigins.Count == 0)
{
corsOrigins = configuration["App:CorsOrigins"]?
.Split(",", StringSplitOptions.RemoveEmptyEntries)
.Select(o => o.RemovePostFix("/"))
.ToList() ?? new List<string>();
}
builder builder
.WithOrigins( .WithOrigins(corsOrigins
configuration["App:CorsOrigins"] .Select(o => o.RemovePostFix("/"))
.Split(",", StringSplitOptions.RemoveEmptyEntries) .ToArray()
.Select(o => o.RemovePostFix("/"))
.ToArray()
) )
.WithAbpExposedHeaders() .WithAbpExposedHeaders()
.WithAbpWrapExposedHeaders() .WithAbpWrapExposedHeaders()

7
aspnet-core/services/LY.MicroService.WechatManagement.HttpApi.Host/WechatManagementHttpApiHostModule.cs

@ -105,10 +105,10 @@ public partial class WechatManagementHttpApiHostModule : AbpModule
ConfigureAuditing(configuration); ConfigureAuditing(configuration);
ConfigureIdentity(configuration); ConfigureIdentity(configuration);
ConfigureMultiTenancy(configuration); ConfigureMultiTenancy(configuration);
ConfigureSwagger(context.Services);
ConfigureJsonSerializer(configuration); ConfigureJsonSerializer(configuration);
ConfigureMvc(context.Services, configuration); ConfigureMvc(context.Services, configuration);
ConfigureCors(context.Services, configuration); ConfigureCors(context.Services, configuration);
ConfigureSwagger(context.Services, configuration);
ConfigureDistributedLock(context.Services, configuration); ConfigureDistributedLock(context.Services, configuration);
ConfigureSecurity(context.Services, configuration, hostingEnvironment.IsDevelopment()); ConfigureSecurity(context.Services, configuration, hostingEnvironment.IsDevelopment());
} }
@ -133,12 +133,11 @@ public partial class WechatManagementHttpApiHostModule : AbpModule
app.UseSwagger(); app.UseSwagger();
app.UseAbpSwaggerUI(options => app.UseAbpSwaggerUI(options =>
{ {
options.SwaggerEndpoint("/swagger/v1/swagger.json", "Support APP API"); options.SwaggerEndpoint("/swagger/v1/swagger.json", "Support Wechat Service API");
var configuration = context.GetConfiguration(); var configuration = context.GetConfiguration();
options.OAuthClientId(configuration["AuthServer:SwaggerClientId"]); options.OAuthClientId(configuration["AuthServer:SwaggerClientId"]);
options.OAuthClientSecret(configuration["AuthServer:SwaggerClientSecret"]); options.OAuthScopes(configuration["AuthServer:Audience"]);
options.OAuthScopes("WechatManagement");
}); });
app.UseAuditing(); app.UseAuditing();
app.UseAbpSerilogEnrichers(); app.UseAbpSerilogEnrichers();

1
aspnet-core/services/LY.MicroService.WechatManagement.HttpApi.Host/appsettings.Development.json

@ -10,6 +10,7 @@
}, },
"App": { "App": {
"ShowPii": true, "ShowPii": true,
"CorsOrigins": [ "http://127.0.0.1:5666" ],
"RefreshClaimsUrl": "http://127.0.0.1:30015" "RefreshClaimsUrl": "http://127.0.0.1:30015"
}, },
"Auditing": { "Auditing": {

53
aspnet-core/services/LY.MicroService.WorkflowManagement.HttpApi.Host/WorkflowManagementHttpApiHostModule.Configure.cs

@ -389,13 +389,32 @@ public partial class WorkflowManagementHttpApiHostModule
}); });
} }
private void ConfigureSwagger(IServiceCollection services) private void ConfigureSwagger(IServiceCollection services, IConfiguration configuration)
{ {
// Swagger // Swagger
services.AddSwaggerGen( services.AddAbpSwaggerGenWithOAuth(
configuration["AuthServer:Authority"],
new Dictionary<string, string>
{
{ configuration["AuthServer:Audience"], "Workflow Service API"}
},
options => options =>
{ {
options.SwaggerDoc("v1", new OpenApiInfo { Title = "Workflow API", Version = "v1" }); options.SwaggerDoc("v1", new OpenApiInfo
{
Title = "Workflow Service API", Version = "v1",
Contact = new OpenApiContact
{
Name = "colin",
Email = "colin.in@foxmail.com",
Url = new Uri("https://github.com/colinin")
},
License = new OpenApiLicense
{
Name = "MIT",
Url = new Uri("https://github.com/colinin/abp-next-admin/blob/master/LICENSE")
}
});
options.DocInclusionPredicate((docName, description) => true); options.DocInclusionPredicate((docName, description) => true);
options.CustomSchemaIds(type => type.FullName); options.CustomSchemaIds(type => type.FullName);
options.AddSecurityDefinition("Bearer", new OpenApiSecurityScheme options.AddSecurityDefinition("Bearer", new OpenApiSecurityScheme
@ -409,13 +428,13 @@ public partial class WorkflowManagementHttpApiHostModule
}); });
options.AddSecurityRequirement(new OpenApiSecurityRequirement options.AddSecurityRequirement(new OpenApiSecurityRequirement
{ {
{
new OpenApiSecurityScheme
{ {
new OpenApiSecurityScheme Reference = new OpenApiReference { Type = ReferenceType.SecurityScheme, Id = "Bearer" }
{ },
Reference = new OpenApiReference { Type = ReferenceType.SecurityScheme, Id = "Bearer" } new string[] { }
}, }
new string[] { }
}
}); });
options.OperationFilter<TenantHeaderParamter>(); options.OperationFilter<TenantHeaderParamter>();
}); });
@ -489,12 +508,18 @@ public partial class WorkflowManagementHttpApiHostModule
{ {
options.AddDefaultPolicy(builder => options.AddDefaultPolicy(builder =>
{ {
var corsOrigins = configuration.GetSection("App:CorsOrigins").Get<List<string>>();
if (corsOrigins == null || corsOrigins.Count == 0)
{
corsOrigins = configuration["App:CorsOrigins"]?
.Split(",", StringSplitOptions.RemoveEmptyEntries)
.Select(o => o.RemovePostFix("/"))
.ToList() ?? new List<string>();
}
builder builder
.WithOrigins( .WithOrigins(corsOrigins
configuration["App:CorsOrigins"] .Select(o => o.RemovePostFix("/"))
.Split(",", StringSplitOptions.RemoveEmptyEntries) .ToArray()
.Select(o => o.RemovePostFix("/"))
.ToArray()
) )
.WithAbpExposedHeaders() .WithAbpExposedHeaders()
.WithAbpWrapExposedHeaders() .WithAbpWrapExposedHeaders()

5
aspnet-core/services/LY.MicroService.WorkflowManagement.HttpApi.Host/WorkflowManagementHttpApiHostModule.cs

@ -124,10 +124,10 @@ public partial class WorkflowManagementHttpApiHostModule : AbpModule
ConfigureIdentity(configuration); ConfigureIdentity(configuration);
ConfigureMultiTenancy(configuration); ConfigureMultiTenancy(configuration);
ConfigureBackgroundTasks(configuration); ConfigureBackgroundTasks(configuration);
ConfigureSwagger(context.Services);
ConfigureEndpoints(context.Services); ConfigureEndpoints(context.Services);
ConfigureMvc(context.Services, configuration); ConfigureMvc(context.Services, configuration);
ConfigureCors(context.Services, configuration); ConfigureCors(context.Services, configuration);
ConfigureSwagger(context.Services, configuration);
ConfigureBlobStoring(context.Services, configuration); ConfigureBlobStoring(context.Services, configuration);
ConfigureDistributedLock(context.Services, configuration); ConfigureDistributedLock(context.Services, configuration);
ConfigureSecurity(context.Services, configuration, hostingEnvironment.IsDevelopment()); ConfigureSecurity(context.Services, configuration, hostingEnvironment.IsDevelopment());
@ -160,8 +160,7 @@ public partial class WorkflowManagementHttpApiHostModule : AbpModule
var configuration = context.GetConfiguration(); var configuration = context.GetConfiguration();
options.OAuthClientId(configuration["AuthServer:SwaggerClientId"]); options.OAuthClientId(configuration["AuthServer:SwaggerClientId"]);
options.OAuthClientSecret(configuration["AuthServer:SwaggerClientSecret"]); options.OAuthScopes(configuration["AuthServer:Audience"]);
options.OAuthScopes(configuration["AuthServer:Scopes"]);
}); });
app.UseAuditing(); app.UseAuditing();
app.UseAbpSerilogEnrichers(); app.UseAbpSerilogEnrichers();

5
aspnet-core/services/LY.MicroService.WorkflowManagement.HttpApi.Host/appsettings.Development.json

@ -9,7 +9,7 @@
"tag": "LINGYUN.Abp.Workflow" "tag": "LINGYUN.Abp.Workflow"
}, },
"App": { "App": {
"CorsOrigins": "http://127.0.0.1:3100", "CorsOrigins": [ "http://127.0.0.1:5666" ],
"ShowPii": true, "ShowPii": true,
"RefreshClaimsUrl": "http://127.0.0.1:30015" "RefreshClaimsUrl": "http://127.0.0.1:30015"
}, },
@ -177,8 +177,7 @@
"RequireHttpsMetadata": false, "RequireHttpsMetadata": false,
"Scopes": "lingyun-abp-application", "Scopes": "lingyun-abp-application",
"ElsaClientId": "InternalServiceClient", "ElsaClientId": "InternalServiceClient",
"SwaggerClientId": "InternalServiceClient", "SwaggerClientId": "vue-oauth-client"
"SwaggerClientSecret": "1q2w3E*"
}, },
"Logging": { "Logging": {
"Serilog": { "Serilog": {

37
aspnet-core/templates/micro/content/host/PackageName.CompanyName.ProjectName.HttpApi.Host/ProjectNameHttpApiHostModule.Configure.cs

@ -317,10 +317,15 @@ public partial class ProjectNameHttpApiHostModule
} }
} }
private void ConfigureSwagger(IServiceCollection services) private void ConfigureSwagger(IServiceCollection services, IConfiguration configuration)
{ {
// Swagger // Swagger
services.AddSwaggerGen( services.AddAbpSwaggerGenWithOAuth(
configuration["AuthServer:Authority"],
new Dictionary<string, string>
{
{ configuration["AuthServer:Audience"], "ProjectName API"}
},
options => options =>
{ {
options.SwaggerDoc("v1", new OpenApiInfo { Title = "ProjectName API", Version = "v1" }); options.SwaggerDoc("v1", new OpenApiInfo { Title = "ProjectName API", Version = "v1" });
@ -337,13 +342,13 @@ public partial class ProjectNameHttpApiHostModule
}); });
options.AddSecurityRequirement(new OpenApiSecurityRequirement options.AddSecurityRequirement(new OpenApiSecurityRequirement
{ {
{
new OpenApiSecurityScheme
{ {
new OpenApiSecurityScheme Reference = new OpenApiReference { Type = ReferenceType.SecurityScheme, Id = "Bearer" }
{ },
Reference = new OpenApiReference { Type = ReferenceType.SecurityScheme, Id = "Bearer" } new string[] { }
}, }
new string[] { }
}
}); });
options.OperationFilter<TenantHeaderParamter>(); options.OperationFilter<TenantHeaderParamter>();
options.HideAbpEndpoints(); options.HideAbpEndpoints();
@ -417,12 +422,18 @@ public partial class ProjectNameHttpApiHostModule
{ {
options.AddDefaultPolicy(builder => options.AddDefaultPolicy(builder =>
{ {
var corsOrigins = configuration.GetSection("App:CorsOrigins").Get<List<string>>();
if (corsOrigins == null || corsOrigins.Count == 0)
{
corsOrigins = configuration["App:CorsOrigins"]?
.Split(",", StringSplitOptions.RemoveEmptyEntries)
.Select(o => o.RemovePostFix("/"))
.ToList() ?? new List<string>();
}
builder builder
.WithOrigins( .WithOrigins(corsOrigins
configuration["App:CorsOrigins"] .Select(o => o.RemovePostFix("/"))
.Split(",", StringSplitOptions.RemoveEmptyEntries) .ToArray()
.Select(o => o.RemovePostFix("/"))
.ToArray()
) )
.WithAbpExposedHeaders() .WithAbpExposedHeaders()
.WithAbpWrapExposedHeaders() .WithAbpWrapExposedHeaders()

5
aspnet-core/templates/micro/content/host/PackageName.CompanyName.ProjectName.HttpApi.Host/ProjectNameHttpApiHostModule.cs

@ -115,9 +115,9 @@ public partial class ProjectNameHttpApiHostModule : AbpModule
ConfigurePermissionManagement(configuration); ConfigurePermissionManagement(configuration);
ConfigureTextTemplatingManagement(configuration); ConfigureTextTemplatingManagement(configuration);
ConfigureSwagger(context.Services);
ConfigureMvc(context.Services, configuration); ConfigureMvc(context.Services, configuration);
ConfigureCors(context.Services, configuration); ConfigureCors(context.Services, configuration);
ConfigureSwagger(context.Services, configuration);
ConfigureDistributedLock(context.Services, configuration); ConfigureDistributedLock(context.Services, configuration);
ConfigureSecurity(context.Services, configuration, hostingEnvironment.IsDevelopment()); ConfigureSecurity(context.Services, configuration, hostingEnvironment.IsDevelopment());
} }
@ -147,8 +147,7 @@ public partial class ProjectNameHttpApiHostModule : AbpModule
var configuration = context.GetConfiguration(); var configuration = context.GetConfiguration();
options.OAuthClientId(configuration["AuthServer:SwaggerClientId"]); options.OAuthClientId(configuration["AuthServer:SwaggerClientId"]);
options.OAuthClientSecret(configuration["AuthServer:SwaggerClientSecret"]); options.OAuthScopes(configuration["AuthServer:Audience"]);
options.OAuthScopes("ProjectName");
}); });
app.UseAuditing(); app.UseAuditing();
app.UseAbpSerilogEnrichers(); app.UseAbpSerilogEnrichers();

5
aspnet-core/templates/micro/content/host/PackageName.CompanyName.ProjectName.HttpApi.Host/appsettings.Development.json

@ -9,7 +9,7 @@
"tag": "PackageName.CompanyName.ProjectName" "tag": "PackageName.CompanyName.ProjectName"
}, },
"App": { "App": {
"CorsOrigins": "http://127.0.0.1:30000", "CorsOrigins": [ "http://127.0.0.1:30000" ],
"RefreshClaimsUrl": "http://127.0.0.1:30015/", "RefreshClaimsUrl": "http://127.0.0.1:30015/",
"HealthChecks": "/healthz" "HealthChecks": "/healthz"
}, },
@ -140,8 +140,7 @@
"Audience": "lingyun-abp-application", "Audience": "lingyun-abp-application",
"MapInboundClaims": false, "MapInboundClaims": false,
"RequireHttpsMetadata": false, "RequireHttpsMetadata": false,
"SwaggerClientId": "InternalServiceClient", "SwaggerClientId": "vue-oauth-client"
"SwaggerClientSecret": "1q2w3E*"
}, },
"FeatureManagement": { "FeatureManagement": {

Loading…
Cancel
Save