Browse Source

Merge pull request #20068 from abpframework/swagger

Remove Tenant placeholders when configure Swagger Oidc
pull/20072/head
maliming 2 years ago
committed by GitHub
parent
commit
617b2aed93
No known key found for this signature in database GPG Key ID: B5690EEEBB952194
  1. 18
      framework/src/Volo.Abp.Swashbuckle/Microsoft/Extensions/DependencyInjection/AbpSwaggerGenServiceCollectionExtensions.cs
  2. 65
      framework/src/Volo.Abp.Swashbuckle/wwwroot/swagger/ui/abp.swagger.js

18
framework/src/Volo.Abp.Swashbuckle/Microsoft/Extensions/DependencyInjection/AbpSwaggerGenServiceCollectionExtensions.cs

@ -5,6 +5,7 @@ using Microsoft.OpenApi.Models;
using Swashbuckle.AspNetCore.SwaggerGen; using Swashbuckle.AspNetCore.SwaggerGen;
using Swashbuckle.AspNetCore.SwaggerUI; using Swashbuckle.AspNetCore.SwaggerUI;
using Volo.Abp.Content; using Volo.Abp.Content;
using Volo.Abp.MultiTenancy;
using Volo.Abp.Swashbuckle; using Volo.Abp.Swashbuckle;
namespace Microsoft.Extensions.DependencyInjection; namespace Microsoft.Extensions.DependencyInjection;
@ -89,16 +90,15 @@ public static class AbpSwaggerGenServiceCollectionExtensions
Action<SwaggerGenOptions>? setupAction = null) Action<SwaggerGenOptions>? setupAction = null)
{ {
var discoveryUrl = discoveryEndpoint != null ? var discoveryUrl = discoveryEndpoint != null ?
new Uri($"{discoveryEndpoint.TrimEnd('/')}/.well-known/openid-configuration") : $"{discoveryEndpoint.TrimEnd('/')}/.well-known/openid-configuration":
new Uri($"{authority.TrimEnd('/')}/.well-known/openid-configuration"); $"{authority.TrimEnd('/')}/.well-known/openid-configuration";
flows ??= new [] { AbpSwaggerOidcFlows.AuthorizationCode }; flows ??= new [] { AbpSwaggerOidcFlows.AuthorizationCode };
services.Configure<SwaggerUIOptions>(swaggerUiOptions => services.Configure<SwaggerUIOptions>(swaggerUiOptions =>
{ {
swaggerUiOptions.ConfigObject.AdditionalItems["oidcSupportedFlows"] = flows; swaggerUiOptions.ConfigObject.AdditionalItems["oidcSupportedFlows"] = flows;
swaggerUiOptions.ConfigObject.AdditionalItems["oidcSupportedScopes"] = scopes; swaggerUiOptions.ConfigObject.AdditionalItems["oidcSupportedScopes"] = scopes;
swaggerUiOptions.ConfigObject.AdditionalItems["oidcDiscoveryEndpoint"] = discoveryEndpoint; swaggerUiOptions.ConfigObject.AdditionalItems["oidcDiscoveryEndpoint"] = discoveryUrl;
}); });
return services return services
@ -109,7 +109,7 @@ public static class AbpSwaggerGenServiceCollectionExtensions
options.AddSecurityDefinition("oidc", new OpenApiSecurityScheme options.AddSecurityDefinition("oidc", new OpenApiSecurityScheme
{ {
Type = SecuritySchemeType.OpenIdConnect, Type = SecuritySchemeType.OpenIdConnect,
OpenIdConnectUrl = discoveryUrl OpenIdConnectUrl = new Uri(RemoveTenantPlaceholders(discoveryUrl))
}); });
options.AddSecurityRequirement(new OpenApiSecurityRequirement options.AddSecurityRequirement(new OpenApiSecurityRequirement
@ -129,4 +129,12 @@ public static class AbpSwaggerGenServiceCollectionExtensions
setupAction?.Invoke(options); setupAction?.Invoke(options);
}); });
} }
private static string RemoveTenantPlaceholders(string url)
{
return url
.Replace(MultiTenantUrlProvider.TenantPlaceHolder + ".", string.Empty)
.Replace(MultiTenantUrlProvider.TenantIdPlaceHolder + ".", string.Empty)
.Replace(MultiTenantUrlProvider.TenantNamePlaceHolder + ".", string.Empty);
}
} }

65
framework/src/Volo.Abp.Swashbuckle/wwwroot/swagger/ui/abp.swagger.js

@ -9,12 +9,12 @@ var abp = abp || {};
var oidcSupportedFlows = configObject.oidcSupportedFlows || []; var oidcSupportedFlows = configObject.oidcSupportedFlows || [];
var oidcSupportedScopes = configObject.oidcSupportedScopes || []; var oidcSupportedScopes = configObject.oidcSupportedScopes || [];
var oidcDiscoveryEndpoint = configObject.oidcDiscoveryEndpoint || []; var oidcDiscoveryEndpoint = configObject.oidcDiscoveryEndpoint || [];
var tenantPlaceHolders = ["{{tenantId}}", "{{tenantName}}" , "{0}"] var tenantPlaceHolders = ["{{tenantId}}", "{{tenantName}}", "{0}"]
abp.appPath = configObject.baseUrl || abp.appPath; abp.appPath = configObject.baseUrl || abp.appPath;
var requestInterceptor = configObject.requestInterceptor; var requestInterceptor = configObject.requestInterceptor;
var responseInterceptor = configObject.responseInterceptor; var responseInterceptor = configObject.responseInterceptor;
configObject.requestInterceptor = async function (request) { configObject.requestInterceptor = async function (request) {
if (request.url.includes(excludeUrl[1])) { if (request.url.includes(excludeUrl[1])) {
@ -27,22 +27,6 @@ var abp = abp || {};
}); });
firstRequest = false; firstRequest = false;
} }
// Intercept .well-known request when the discoveryEndpoint is provided
if (!firstRequest && oidcDiscoveryEndpoint.length !== 0 && request.url.includes(".well-known/openid-configuration")) {
if (oidcDiscoveryEndpoint.endsWith(".well-known/openid-configuration")) {
request.url = await replaceTenantPlaceHolder(oidcDiscoveryEndpoint);
console.log(request.url);
return;
}
if (!oidcDiscoveryEndpoint.endsWith("/")) {
oidcDiscoveryEndpoint += "/"
}
request.url = await replaceTenantPlaceHolder(oidcDiscoveryEndpoint) + ".well-known/openid-configuration";
console.log(request.url);
}
var antiForgeryToken = abp.security.antiForgery.getToken(); var antiForgeryToken = abp.security.antiForgery.getToken();
if (antiForgeryToken) { if (antiForgeryToken) {
@ -78,33 +62,50 @@ var abp = abp || {};
response.text = JSON.stringify(openIdConnectData); response.text = JSON.stringify(openIdConnectData);
} }
// Intercept .well-known request when the discoveryEndpoint is provided
if (response.url.endsWith("swagger.json") && response.status === 200 && oidcDiscoveryEndpoint.length !== 0) {
var swaggerData = JSON.parse(response.text);
if (swaggerData.components.securitySchemes && swaggerData.components.securitySchemes.oidc) {
swaggerData.components.securitySchemes.oidc.openIdConnectUrl = await replaceTenantPlaceHolder(oidcDiscoveryEndpoint);
}
response.text = JSON.stringify(swaggerData);
}
if (responseInterceptor) { if (responseInterceptor) {
responseInterceptor(response); responseInterceptor(response);
} }
return response; return response;
}; };
async function replaceTenantPlaceHolder(url) { async function replaceTenantPlaceHolder(url) {
if(!abp.currentTenant){ if (!abp.currentTenant) {
await getAbpApplicationConfiguration(); await getAbpApplicationConfiguration();
} }
url.replace(tenantPlaceHolders[0], abp.currentTenant.id); if (abp.currentTenant.id == null && abp.currentTenant.name == null) {
url.replace(tenantPlaceHolders[1], abp.currentTenant.name); return url
.replace(tenantPlaceHolders[0] + ".", "")
if(abp.currentTenant.name != null){ .replace(tenantPlaceHolders[1] + ".", "")
url.replace(tenantPlaceHolders[2], abp.currentTenant.name); .replace(tenantPlaceHolders[2] + ".", "");
}else if (abp.currentTenant.id != null){
url.replace(tenantPlaceHolders[2], abp.currentTenant.id);
} }
url = url.replace(tenantPlaceHolders[0], abp.currentTenant.id).replace(tenantPlaceHolders[1], abp.currentTenant.name);
if (abp.currentTenant.name != null) {
url = url.replace(tenantPlaceHolders[2], abp.currentTenant.name);
} else if (abp.currentTenant.id != null) {
url = url.replace(tenantPlaceHolders[2], abp.currentTenant.id);
}
return url; return url;
} }
function getAbpApplicationConfiguration() { function getAbpApplicationConfiguration() {
return fetch(`${abp.appPath}api/abp/application-configuration`).then(response => response.json()).then(data => { return fetch(`${abp.appPath}api/abp/application-configuration`).then(response => response.json()).then(data => {
abp.currentTenant = data.currentTenant; abp.currentTenant = data.currentTenant;
}); });
} }

Loading…
Cancel
Save