diff --git a/framework/src/Volo.Abp.Core/Volo/Abp/Http/UrlHelpers.cs b/framework/src/Volo.Abp.Core/Volo/Abp/Http/UrlHelpers.cs index 30e5e81be2..f27fb4c591 100644 --- a/framework/src/Volo.Abp.Core/Volo/Abp/Http/UrlHelpers.cs +++ b/framework/src/Volo.Abp.Core/Volo/Abp/Http/UrlHelpers.cs @@ -6,6 +6,10 @@ public static class UrlHelpers { private const string WildcardSubdomain = "*."; + /// + /// Check if the subdomain is a subdomain of the domain. + /// The Uri must be absolute URI and the scheme, port, and host must be the same. + /// public static bool IsSubdomainOf(string subdomain, string domain) { if (Uri.TryCreate(subdomain, UriKind.Absolute, out var subdomainUri) && @@ -17,6 +21,10 @@ public static class UrlHelpers return false; } + /// + /// Check if the subdomain is a subdomain of the domain. + /// The Uri must be absolute URI and the scheme, port, and host must be the same. + /// public static bool IsSubdomainOf(Uri subdomain, Uri domain) { return subdomain.IsAbsoluteUri diff --git a/modules/openiddict/app/OpenIddict.Demo.Server/OpenIddictServerModule.cs b/modules/openiddict/app/OpenIddict.Demo.Server/OpenIddictServerModule.cs index e73bb0e77f..b6e262ee32 100644 --- a/modules/openiddict/app/OpenIddict.Demo.Server/OpenIddictServerModule.cs +++ b/modules/openiddict/app/OpenIddict.Demo.Server/OpenIddictServerModule.cs @@ -34,6 +34,7 @@ using Volo.Abp.SettingManagement.Web; using Volo.Abp.TenantManagement; using Volo.Abp.TenantManagement.EntityFrameworkCore; using Volo.Abp.TenantManagement.Web; +using Volo.Abp.Uow; namespace OpenIddict.Demo.Server; @@ -116,7 +117,7 @@ public class OpenIddictServerModule : AbpModule PreConfigure(options => { options.EnableWildcardDomainSupport = true; - options.WildcardDomainsFormat.Add("https://{0}.abp.io/signin-oidc"); + options.WildcardDomainsFormat.Add("https://*.abp.io"); }); PreConfigure(builder => @@ -155,8 +156,19 @@ public class OpenIddictServerModule : AbpModule }); } - public async override Task OnApplicationInitializationAsync(ApplicationInitializationContext context) + public async override Task OnPreApplicationInitializationAsync(ApplicationInitializationContext context) { + using var uow = context.ServiceProvider.GetRequiredService().Begin(); + { + var dbContext = await context.ServiceProvider.GetRequiredService>().GetDbContextAsync(); + if ((await dbContext.Database.GetPendingMigrationsAsync()).Any()) + { + await dbContext.Database.MigrateAsync(); + } + + await uow.CompleteAsync(); + } + await context.ServiceProvider .GetRequiredService() .SeedAsync(); diff --git a/modules/openiddict/src/Volo.Abp.OpenIddict.AspNetCore/Volo/Abp/OpenIddict/WildcardDomains/AbpOpenIddictWildcardDomainBase.cs b/modules/openiddict/src/Volo.Abp.OpenIddict.AspNetCore/Volo/Abp/OpenIddict/WildcardDomains/AbpOpenIddictWildcardDomainBase.cs index c3ba2c6bce..7525d75d47 100644 --- a/modules/openiddict/src/Volo.Abp.OpenIddict.AspNetCore/Volo/Abp/OpenIddict/WildcardDomains/AbpOpenIddictWildcardDomainBase.cs +++ b/modules/openiddict/src/Volo.Abp.OpenIddict.AspNetCore/Volo/Abp/OpenIddict/WildcardDomains/AbpOpenIddictWildcardDomainBase.cs @@ -1,10 +1,11 @@ -using System; +using System.Linq; using System.Threading.Tasks; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging.Abstractions; using Microsoft.Extensions.Options; +using Microsoft.IdentityModel.Tokens; using OpenIddict.Server; -using Volo.Abp.Text.Formatting; +using Volo.Abp.Http; namespace Volo.Abp.OpenIddict.WildcardDomains; @@ -29,30 +30,24 @@ public abstract class AbpOpenIddictWildcardDomainBase CheckWildcardDomainAsync(string url) { - Logger.LogDebug("Checking wildcard domain for url: {url}", url); - - foreach (var domainFormat in WildcardDomainOptions.WildcardDomainsFormat) + if (WildcardDomainOptions.WildcardDomainsFormat.IsNullOrEmpty()) { - Logger.LogDebug("Checking wildcard domain format: {domainFormat}", domainFormat); - var extractResult = FormattedStringValueExtracter.Extract(url, domainFormat, ignoreCase: true); - if (extractResult.IsMatch) - { - Logger.LogDebug("Wildcard domain found for url: {url}", url); - return Task.FromResult(true); - } + Logger.LogDebug("No wildcard domain format configured."); + return Task.FromResult(false); } - foreach (var domainFormat in WildcardDomainOptions.WildcardDomainsFormat) + Logger.LogDebug("Checking wildcard domain for url: {url}", url); + foreach (var domain in WildcardDomainOptions.WildcardDomainsFormat.Select(domainFormat => domainFormat.Replace("{0}", "*"))) { - Logger.LogDebug("Checking wildcard domain format: {domainFormat}", domainFormat); - if (domainFormat.Replace("{0}.", "").Equals(url, StringComparison.OrdinalIgnoreCase)) + Logger.LogDebug("Checking wildcard domain format: {newDomainFormat}", domain); + if (UrlHelpers.IsSubdomainOf(url, domain)) { - Logger.LogDebug("Wildcard domain found for url: {url}", url); + Logger.LogDebug("The url: {url} is a wildcard domain of: {domain}", url, domain); return Task.FromResult(true); } } - Logger.LogDebug("Wildcard domain not found for url: {url}", url); + Logger.LogDebug("No wildcard domain found for url: {url}", url); return Task.FromResult(false); } } diff --git a/modules/openiddict/src/Volo.Abp.OpenIddict.AspNetCore/Volo/Abp/OpenIddict/WildcardDomains/AbpOpenIddictWildcardDomainOptions.cs b/modules/openiddict/src/Volo.Abp.OpenIddict.AspNetCore/Volo/Abp/OpenIddict/WildcardDomains/AbpOpenIddictWildcardDomainOptions.cs index 358974e3d6..54c56178f9 100644 --- a/modules/openiddict/src/Volo.Abp.OpenIddict.AspNetCore/Volo/Abp/OpenIddict/WildcardDomains/AbpOpenIddictWildcardDomainOptions.cs +++ b/modules/openiddict/src/Volo.Abp.OpenIddict.AspNetCore/Volo/Abp/OpenIddict/WildcardDomains/AbpOpenIddictWildcardDomainOptions.cs @@ -6,6 +6,9 @@ public class AbpOpenIddictWildcardDomainOptions { public bool EnableWildcardDomainSupport { get; set; } + /// + /// Wildcard domains format. For example: https://*.abp.io + /// public HashSet WildcardDomainsFormat { get; } public AbpOpenIddictWildcardDomainOptions()