From 747c61472a24ad0eac3a74be719aed31325d02d6 Mon Sep 17 00:00:00 2001 From: liangshiwei Date: Wed, 19 Jun 2024 10:33:20 +0800 Subject: [PATCH 1/3] Remove Tenant placeholders when configure Swagger Oidc --- ...AbpSwaggerGenServiceCollectionExtensions.cs | 18 +++++++++++++----- .../wwwroot/swagger/ui/abp.swagger.js | 14 ++++++++++---- 2 files changed, 23 insertions(+), 9 deletions(-) diff --git a/framework/src/Volo.Abp.Swashbuckle/Microsoft/Extensions/DependencyInjection/AbpSwaggerGenServiceCollectionExtensions.cs b/framework/src/Volo.Abp.Swashbuckle/Microsoft/Extensions/DependencyInjection/AbpSwaggerGenServiceCollectionExtensions.cs index 0acdf852e5..1238d766be 100644 --- a/framework/src/Volo.Abp.Swashbuckle/Microsoft/Extensions/DependencyInjection/AbpSwaggerGenServiceCollectionExtensions.cs +++ b/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.SwaggerUI; using Volo.Abp.Content; +using Volo.Abp.MultiTenancy; using Volo.Abp.Swashbuckle; namespace Microsoft.Extensions.DependencyInjection; @@ -89,16 +90,15 @@ public static class AbpSwaggerGenServiceCollectionExtensions Action? setupAction = null) { var discoveryUrl = discoveryEndpoint != null ? - new Uri($"{discoveryEndpoint.TrimEnd('/')}/.well-known/openid-configuration") : - new Uri($"{authority.TrimEnd('/')}/.well-known/openid-configuration"); - + $"{discoveryEndpoint.TrimEnd('/')}/.well-known/openid-configuration": + $"{authority.TrimEnd('/')}/.well-known/openid-configuration"; flows ??= new [] { AbpSwaggerOidcFlows.AuthorizationCode }; services.Configure(swaggerUiOptions => { swaggerUiOptions.ConfigObject.AdditionalItems["oidcSupportedFlows"] = flows; swaggerUiOptions.ConfigObject.AdditionalItems["oidcSupportedScopes"] = scopes; - swaggerUiOptions.ConfigObject.AdditionalItems["oidcDiscoveryEndpoint"] = discoveryEndpoint; + swaggerUiOptions.ConfigObject.AdditionalItems["oidcDiscoveryEndpoint"] = discoveryUrl; }); return services @@ -109,7 +109,7 @@ public static class AbpSwaggerGenServiceCollectionExtensions options.AddSecurityDefinition("oidc", new OpenApiSecurityScheme { Type = SecuritySchemeType.OpenIdConnect, - OpenIdConnectUrl = discoveryUrl + OpenIdConnectUrl = new Uri(RemoveTenantPlaceholders(discoveryUrl)) }); options.AddSecurityRequirement(new OpenApiSecurityRequirement @@ -129,4 +129,12 @@ public static class AbpSwaggerGenServiceCollectionExtensions 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); + } } diff --git a/framework/src/Volo.Abp.Swashbuckle/wwwroot/swagger/ui/abp.swagger.js b/framework/src/Volo.Abp.Swashbuckle/wwwroot/swagger/ui/abp.swagger.js index 07deea114b..003105a81a 100644 --- a/framework/src/Volo.Abp.Swashbuckle/wwwroot/swagger/ui/abp.swagger.js +++ b/framework/src/Volo.Abp.Swashbuckle/wwwroot/swagger/ui/abp.swagger.js @@ -90,13 +90,19 @@ var abp = abp || {}; await getAbpApplicationConfiguration(); } - url.replace(tenantPlaceHolders[0], abp.currentTenant.id); - url.replace(tenantPlaceHolders[1], abp.currentTenant.name); + if(abp.currentTenant.id == null && abp.currentTenant.name == null){ + return url + .replace(tenantPlaceHolders[0] + ".", "") + .replace(tenantPlaceHolders[1] + ".", "") + .replace(tenantPlaceHolders[2] + ".", ""); + } + + url = url.replace(tenantPlaceHolders[0], abp.currentTenant.id).url.replace(tenantPlaceHolders[1], abp.currentTenant.name); if(abp.currentTenant.name != null){ - url.replace(tenantPlaceHolders[2], abp.currentTenant.name); + url = url.replace(tenantPlaceHolders[2], abp.currentTenant.name); }else if (abp.currentTenant.id != null){ - url.replace(tenantPlaceHolders[2], abp.currentTenant.id); + url = url.replace(tenantPlaceHolders[2], abp.currentTenant.id); } return url; From 90557afbc63145844adf386ff692fdf69df871d0 Mon Sep 17 00:00:00 2001 From: liangshiwei Date: Wed, 19 Jun 2024 13:13:54 +0800 Subject: [PATCH 2/3] Update abp.swagger.js --- .../src/Volo.Abp.Swashbuckle/wwwroot/swagger/ui/abp.swagger.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/framework/src/Volo.Abp.Swashbuckle/wwwroot/swagger/ui/abp.swagger.js b/framework/src/Volo.Abp.Swashbuckle/wwwroot/swagger/ui/abp.swagger.js index 003105a81a..be976dd4c5 100644 --- a/framework/src/Volo.Abp.Swashbuckle/wwwroot/swagger/ui/abp.swagger.js +++ b/framework/src/Volo.Abp.Swashbuckle/wwwroot/swagger/ui/abp.swagger.js @@ -97,7 +97,7 @@ var abp = abp || {}; .replace(tenantPlaceHolders[2] + ".", ""); } - url = url.replace(tenantPlaceHolders[0], abp.currentTenant.id).url.replace(tenantPlaceHolders[1], abp.currentTenant.name); + 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); From 4e7ea23573d4f77efa65b2b82c44f67252658c29 Mon Sep 17 00:00:00 2001 From: liangshiwei Date: Wed, 19 Jun 2024 15:09:49 +0800 Subject: [PATCH 3/3] Move discoveryEndpoint handle to response responseInterceptor --- .../wwwroot/swagger/ui/abp.swagger.js | 65 +++++++++---------- 1 file changed, 30 insertions(+), 35 deletions(-) diff --git a/framework/src/Volo.Abp.Swashbuckle/wwwroot/swagger/ui/abp.swagger.js b/framework/src/Volo.Abp.Swashbuckle/wwwroot/swagger/ui/abp.swagger.js index be976dd4c5..4e8790d38c 100644 --- a/framework/src/Volo.Abp.Swashbuckle/wwwroot/swagger/ui/abp.swagger.js +++ b/framework/src/Volo.Abp.Swashbuckle/wwwroot/swagger/ui/abp.swagger.js @@ -9,12 +9,12 @@ var abp = abp || {}; var oidcSupportedFlows = configObject.oidcSupportedFlows || []; var oidcSupportedScopes = configObject.oidcSupportedScopes || []; var oidcDiscoveryEndpoint = configObject.oidcDiscoveryEndpoint || []; - var tenantPlaceHolders = ["{{tenantId}}", "{{tenantName}}" , "{0}"] + var tenantPlaceHolders = ["{{tenantId}}", "{{tenantName}}", "{0}"] abp.appPath = configObject.baseUrl || abp.appPath; var requestInterceptor = configObject.requestInterceptor; var responseInterceptor = configObject.responseInterceptor; - + configObject.requestInterceptor = async function (request) { if (request.url.includes(excludeUrl[1])) { @@ -27,22 +27,6 @@ var abp = abp || {}; }); 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(); if (antiForgeryToken) { @@ -78,39 +62,50 @@ var abp = abp || {}; 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) { responseInterceptor(response); } return response; }; - + async function replaceTenantPlaceHolder(url) { - - if(!abp.currentTenant){ + + if (!abp.currentTenant) { await getAbpApplicationConfiguration(); } - - if(abp.currentTenant.id == null && abp.currentTenant.name == null){ - return url - .replace(tenantPlaceHolders[0] + ".", "") - .replace(tenantPlaceHolders[1] + ".", "") - .replace(tenantPlaceHolders[2] + ".", ""); - } - + + if (abp.currentTenant.id == null && abp.currentTenant.name == null) { + return url + .replace(tenantPlaceHolders[0] + ".", "") + .replace(tenantPlaceHolders[1] + ".", "") + .replace(tenantPlaceHolders[2] + ".", ""); + } + url = url.replace(tenantPlaceHolders[0], abp.currentTenant.id).replace(tenantPlaceHolders[1], abp.currentTenant.name); - - if(abp.currentTenant.name != null){ + + if (abp.currentTenant.name != null) { url = url.replace(tenantPlaceHolders[2], abp.currentTenant.name); - }else if (abp.currentTenant.id != null){ + } else if (abp.currentTenant.id != null) { url = url.replace(tenantPlaceHolders[2], abp.currentTenant.id); } - + return url; } - + function getAbpApplicationConfiguration() { return fetch(`${abp.appPath}api/abp/application-configuration`).then(response => response.json()).then(data => { - abp.currentTenant = data.currentTenant; + abp.currentTenant = data.currentTenant; }); }