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..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,33 +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(); } - - 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); - }else if (abp.currentTenant.id != null){ - url.replace(tenantPlaceHolders[2], abp.currentTenant.id); + + 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) { + url = url.replace(tenantPlaceHolders[2], abp.currentTenant.name); + } 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; }); }