diff --git a/src/Squidex.Infrastructure/StringExtensions.cs b/src/Squidex.Infrastructure/StringExtensions.cs index 8808b649a..93a56333e 100644 --- a/src/Squidex.Infrastructure/StringExtensions.cs +++ b/src/Squidex.Infrastructure/StringExtensions.cs @@ -382,5 +382,20 @@ namespace Squidex.Infrastructure return result.ToString().Trim(separator); } + + public static string BuildFullUrl(this string baseUrl, string path, bool trailingSlash = false) + { + var url = $"{baseUrl.TrimEnd('/')}/{path.Trim('/')}"; + + if (trailingSlash && + url.IndexOf("#", StringComparison.OrdinalIgnoreCase) < 0 && + url.IndexOf("?", StringComparison.OrdinalIgnoreCase) < 0 && + url.IndexOf(";", StringComparison.OrdinalIgnoreCase) < 0) + { + url = url + "/"; + } + + return url; + } } } diff --git a/src/Squidex/Config/Identity/IdentityUsage.cs b/src/Squidex/Config/Identity/IdentityUsage.cs index 1838bf848..f08cbb6f4 100644 --- a/src/Squidex/Config/Identity/IdentityUsage.cs +++ b/src/Squidex/Config/Identity/IdentityUsage.cs @@ -14,6 +14,7 @@ using Microsoft.AspNetCore.Identity; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Options; using Squidex.Domain.Users; +using Squidex.Infrastructure; using Squidex.Infrastructure.Log; using Squidex.Shared.Identity; using Squidex.Shared.Users; @@ -93,10 +94,19 @@ namespace Squidex.Config.Identity if (!string.IsNullOrWhiteSpace(urlsOptions.BaseUrl)) { - var apiAuthorityUrl = urlsOptions.BuildUrl(Constants.IdentityPrefix); - var identityOptions = app.ApplicationServices.GetService>().Value; + string apiAuthorityUrl; + + if (!string.IsNullOrWhiteSpace(identityOptions.AuthorityUrl)) + { + apiAuthorityUrl = identityOptions.AuthorityUrl.BuildFullUrl(Constants.IdentityPrefix); + } + else + { + apiAuthorityUrl = urlsOptions.BuildUrl(Constants.IdentityPrefix); + } + app.UseIdentityServerAuthentication(new IdentityServerAuthenticationOptions { Authority = apiAuthorityUrl, diff --git a/src/Squidex/Config/Identity/MyIdentityOptions.cs b/src/Squidex/Config/Identity/MyIdentityOptions.cs index 9dde059cb..ae8383df3 100644 --- a/src/Squidex/Config/Identity/MyIdentityOptions.cs +++ b/src/Squidex/Config/Identity/MyIdentityOptions.cs @@ -26,6 +26,8 @@ namespace Squidex.Config.Identity public string MicrosoftSecret { get; set; } + public string AuthorityUrl { get; set; } + public bool RequiresHttps { get; set; } public bool AllowPasswordAuth { get; set; } diff --git a/src/Squidex/Config/MyUrlsOptions.cs b/src/Squidex/Config/MyUrlsOptions.cs index 19b462f3c..efcecc243 100644 --- a/src/Squidex/Config/MyUrlsOptions.cs +++ b/src/Squidex/Config/MyUrlsOptions.cs @@ -6,7 +6,6 @@ // All rights reserved. // ========================================================================== -using System; using Squidex.Infrastructure; namespace Squidex.Config @@ -23,17 +22,8 @@ namespace Squidex.Config { throw new ConfigurationException("Configure BaseUrl with 'urls:baseUrl'."); } - - var url = $"{BaseUrl.TrimEnd('/')}/{path.Trim('/')}"; - - if (trailingSlash && - url.IndexOf("?", StringComparison.OrdinalIgnoreCase) < 0 && - url.IndexOf(";", StringComparison.OrdinalIgnoreCase) < 0) - { - url = url + "/"; - } - - return url; + + return BaseUrl.BuildFullUrl(path, trailingSlash); } } } diff --git a/tests/Squidex.Infrastructure.Tests/StringExtensionsTests.cs b/tests/Squidex.Infrastructure.Tests/StringExtensionsTests.cs index 76861ac81..6448da561 100644 --- a/tests/Squidex.Infrastructure.Tests/StringExtensionsTests.cs +++ b/tests/Squidex.Infrastructure.Tests/StringExtensionsTests.cs @@ -103,5 +103,27 @@ namespace Squidex.Infrastructure Assert.Equal(value, value.WithFallback("fallback")); } + + [Theory] + [InlineData("http://squidex.io/base/", "path/to/res", false, "http://squidex.io/base/path/to/res")] + [InlineData("http://squidex.io/base/", "path/to/res", true, "http://squidex.io/base/path/to/res/")] + [InlineData("http://squidex.io/base/", "/path/to/res", true, "http://squidex.io/base/path/to/res/")] + public void Should_provide_full_url_without_query_or_fragment(string baseUrl, string path, bool trailingSlash, string output) + { + var result = baseUrl.BuildFullUrl(path, trailingSlash); + + Assert.Equal(output, result); + } + + [Theory] + [InlineData("http://squidex.io/base/", "path/to/res?query=1", false, "http://squidex.io/base/path/to/res?query=1")] + [InlineData("http://squidex.io/base/", "path/to/res#query=1", true, "http://squidex.io/base/path/to/res#query=1")] + [InlineData("http://squidex.io/base/", "path/to/res;query=1", true, "http://squidex.io/base/path/to/res;query=1")] + public void Should_provide_full_url_wit_query_or_fragment(string baseUrl, string path, bool trailingSlash, string output) + { + var result = baseUrl.BuildFullUrl(path, trailingSlash); + + Assert.Equal(output, result); + } } }