diff --git a/gen/OpenIddict.Client.WebIntegration.Generators/OpenIddictClientWebIntegrationGenerator.cs b/gen/OpenIddict.Client.WebIntegration.Generators/OpenIddictClientWebIntegrationGenerator.cs
index 7bfa6079..e749c97c 100644
--- a/gen/OpenIddict.Client.WebIntegration.Generators/OpenIddictClientWebIntegrationGenerator.cs
+++ b/gen/OpenIddict.Client.WebIntegration.Generators/OpenIddictClientWebIntegrationGenerator.cs
@@ -419,7 +419,7 @@ public sealed partial class OpenIddictClientWebIntegrationBuilder
throw new ArgumentNullException(nameof({{ setting.parameter_name }}));
}
- if (!{{ setting.parameter_name }}.IsAbsoluteUri || !{{ setting.parameter_name }}.IsWellFormedOriginalString())
+ if (!{{ setting.parameter_name }}.IsAbsoluteUri || OpenIddictHelpers.IsImplicitFileUri({{ setting.parameter_name }}))
{
throw new ArgumentException(SR.GetResourceString(SR.ID0144), nameof({{ setting.parameter_name }}));
}
@@ -804,6 +804,7 @@ using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Options;
using Microsoft.IdentityModel.Tokens;
using OpenIddict.Client;
+using OpenIddict.Extensions;
using static OpenIddict.Client.WebIntegration.OpenIddictClientWebIntegrationConstants;
using static OpenIddict.Extensions.OpenIddictHelpers;
@@ -891,7 +892,7 @@ public sealed partial class OpenIddictClientWebIntegrationConfiguration
{{~ end ~}}
{{~ if setting.type == 'Uri' ~}}
- if (!settings.{{ setting.property_name }}.IsAbsoluteUri || !settings.{{ setting.property_name }}.IsWellFormedOriginalString())
+ if (!settings.{{ setting.property_name }}.IsAbsoluteUri || OpenIddictHelpers.IsImplicitFileUri(settings.{{ setting.property_name }}))
{
throw new InvalidOperationException(SR.FormatID0350(nameof(settings.{{ setting.property_name }}), Providers.{{ provider.name }}));
}
diff --git a/shared/OpenIddict.Extensions/OpenIddictHelpers.cs b/shared/OpenIddict.Extensions/OpenIddictHelpers.cs
index 29951a22..49469fb3 100644
--- a/shared/OpenIddict.Extensions/OpenIddictHelpers.cs
+++ b/shared/OpenIddict.Extensions/OpenIddictHelpers.cs
@@ -296,6 +296,26 @@ internal static class OpenIddictHelpers
return left.IsBaseOf(right);
}
+ ///
+ /// Determines whether the specified represents an implicit file URI.
+ ///
+ /// The URI.
+ ///
+ /// if represents
+ /// an implicit file URI, otherwise.
+ ///
+ /// is .
+ public static bool IsImplicitFileUri(Uri uri)
+ {
+ if (uri is null)
+ {
+ throw new ArgumentNullException(nameof(uri));
+ }
+
+ return uri.IsAbsoluteUri && uri.IsFile &&
+ !uri.OriginalString.StartsWith(uri.Scheme, StringComparison.OrdinalIgnoreCase);
+ }
+
///
/// Adds a query string parameter to the specified .
///
diff --git a/src/OpenIddict.Client.AspNetCore/OpenIddictClientAspNetCoreHandlers.cs b/src/OpenIddict.Client.AspNetCore/OpenIddictClientAspNetCoreHandlers.cs
index d3fbef02..bd95192e 100644
--- a/src/OpenIddict.Client.AspNetCore/OpenIddictClientAspNetCoreHandlers.cs
+++ b/src/OpenIddict.Client.AspNetCore/OpenIddictClientAspNetCoreHandlers.cs
@@ -577,7 +577,7 @@ public static partial class OpenIddictClientAspNetCoreHandlers
if (properties.Items.TryGetValue(Properties.Issuer, out string? issuer) && !string.IsNullOrEmpty(issuer))
{
// Ensure the issuer set by the application is a valid absolute URI.
- if (!Uri.TryCreate(issuer, UriKind.Absolute, out Uri? uri) || !uri.IsWellFormedOriginalString())
+ if (!Uri.TryCreate(issuer, UriKind.Absolute, out Uri? uri) || OpenIddictHelpers.IsImplicitFileUri(uri))
{
throw new InvalidOperationException(SR.GetResourceString(SR.ID0306));
}
@@ -817,7 +817,7 @@ public static partial class OpenIddictClientAspNetCoreHandlers
if (properties.Items.TryGetValue(Properties.Issuer, out string? issuer) && !string.IsNullOrEmpty(issuer))
{
// Ensure the issuer set by the application is a valid absolute URI.
- if (!Uri.TryCreate(issuer, UriKind.Absolute, out Uri? uri) || !uri.IsWellFormedOriginalString())
+ if (!Uri.TryCreate(issuer, UriKind.Absolute, out Uri? uri) || OpenIddictHelpers.IsImplicitFileUri(uri))
{
throw new InvalidOperationException(SR.GetResourceString(SR.ID0306));
}
diff --git a/src/OpenIddict.Client.Owin/OpenIddictClientOwinHandlers.cs b/src/OpenIddict.Client.Owin/OpenIddictClientOwinHandlers.cs
index 11ac62b4..00a94ae1 100644
--- a/src/OpenIddict.Client.Owin/OpenIddictClientOwinHandlers.cs
+++ b/src/OpenIddict.Client.Owin/OpenIddictClientOwinHandlers.cs
@@ -589,7 +589,7 @@ public static partial class OpenIddictClientOwinHandlers
if (properties.Dictionary.TryGetValue(Properties.Issuer, out string? issuer) && !string.IsNullOrEmpty(issuer))
{
// Ensure the issuer set by the application is a valid absolute URI.
- if (!Uri.TryCreate(issuer, UriKind.Absolute, out Uri? uri) || !uri.IsWellFormedOriginalString())
+ if (!Uri.TryCreate(issuer, UriKind.Absolute, out Uri? uri) || OpenIddictHelpers.IsImplicitFileUri(uri))
{
throw new InvalidOperationException(SR.GetResourceString(SR.ID0306));
}
@@ -855,7 +855,7 @@ public static partial class OpenIddictClientOwinHandlers
if (properties.Dictionary.TryGetValue(Properties.Issuer, out string? issuer) && !string.IsNullOrEmpty(issuer))
{
// Ensure the issuer set by the application is a valid absolute URI.
- if (!Uri.TryCreate(issuer, UriKind.Absolute, out Uri? uri) || !uri.IsWellFormedOriginalString())
+ if (!Uri.TryCreate(issuer, UriKind.Absolute, out Uri? uri) || OpenIddictHelpers.IsImplicitFileUri(uri))
{
throw new InvalidOperationException(SR.GetResourceString(SR.ID0306));
}
diff --git a/src/OpenIddict.Client.SystemIntegration/OpenIddictClientSystemIntegrationActivation.cs b/src/OpenIddict.Client.SystemIntegration/OpenIddictClientSystemIntegrationActivation.cs
index 9174a76d..60abf000 100644
--- a/src/OpenIddict.Client.SystemIntegration/OpenIddictClientSystemIntegrationActivation.cs
+++ b/src/OpenIddict.Client.SystemIntegration/OpenIddictClientSystemIntegrationActivation.cs
@@ -5,6 +5,7 @@
*/
using System.ComponentModel;
+using OpenIddict.Extensions;
namespace OpenIddict.Client.SystemIntegration;
@@ -26,7 +27,7 @@ public sealed class OpenIddictClientSystemIntegrationActivation
throw new ArgumentNullException(nameof(uri));
}
- if (!uri.IsAbsoluteUri || !uri.IsWellFormedOriginalString())
+ if (!uri.IsAbsoluteUri || OpenIddictHelpers.IsImplicitFileUri(uri))
{
throw new ArgumentException(SR.GetResourceString(SR.ID0144), nameof(uri));
}
diff --git a/src/OpenIddict.Client.SystemIntegration/OpenIddictClientSystemIntegrationHelpers.cs b/src/OpenIddict.Client.SystemIntegration/OpenIddictClientSystemIntegrationHelpers.cs
index 976e7819..903d2e90 100644
--- a/src/OpenIddict.Client.SystemIntegration/OpenIddictClientSystemIntegrationHelpers.cs
+++ b/src/OpenIddict.Client.SystemIntegration/OpenIddictClientSystemIntegrationHelpers.cs
@@ -273,11 +273,8 @@ public static class OpenIddictClientSystemIntegrationHelpers
//
// For more information, see https://devblogs.microsoft.com/oldnewthing/20060515-07/?p=31203.
- [_, string argument] when Uri.TryCreate(argument, UriKind.Absolute, out Uri? uri) &&
- !uri.IsFile && uri.IsWellFormedOriginalString() => uri,
-
- [string argument] when Uri.TryCreate(argument, UriKind.Absolute, out Uri? uri) &&
- !uri.IsFile && uri.IsWellFormedOriginalString() => uri,
+ [_, string argument] when Uri.TryCreate(argument, UriKind.Absolute, out Uri? uri) && !uri.IsFile => uri,
+ [ string argument] when Uri.TryCreate(argument, UriKind.Absolute, out Uri? uri) && !uri.IsFile => uri,
_ => null
};
diff --git a/src/OpenIddict.Client/OpenIddictClientBuilder.cs b/src/OpenIddict.Client/OpenIddictClientBuilder.cs
index a072093a..08e7546f 100644
--- a/src/OpenIddict.Client/OpenIddictClientBuilder.cs
+++ b/src/OpenIddict.Client/OpenIddictClientBuilder.cs
@@ -1081,7 +1081,7 @@ public sealed class OpenIddictClientBuilder
throw new ArgumentNullException(nameof(uris));
}
- if (Array.Exists(uris, static uri => !uri.IsWellFormedOriginalString()))
+ if (Array.Exists(uris, OpenIddictHelpers.IsImplicitFileUri))
{
throw new ArgumentException(SR.GetResourceString(SR.ID0072), nameof(uris));
}
@@ -1128,7 +1128,7 @@ public sealed class OpenIddictClientBuilder
throw new ArgumentNullException(nameof(uris));
}
- if (Array.Exists(uris, static uri => !uri.IsWellFormedOriginalString()))
+ if (Array.Exists(uris, OpenIddictHelpers.IsImplicitFileUri))
{
throw new ArgumentException(SR.GetResourceString(SR.ID0072), nameof(uris));
}
@@ -1197,7 +1197,7 @@ public sealed class OpenIddictClientBuilder
throw new ArgumentException(SR.FormatID0366(nameof(uri)), nameof(uri));
}
- if (!Uri.TryCreate(uri, UriKind.Absolute, out Uri? value) || !value.IsWellFormedOriginalString())
+ if (!Uri.TryCreate(uri, UriKind.Absolute, out Uri? value) || OpenIddictHelpers.IsImplicitFileUri(value))
{
throw new ArgumentException(SR.GetResourceString(SR.ID0144), nameof(uri));
}
diff --git a/src/OpenIddict.Client/OpenIddictClientConfiguration.cs b/src/OpenIddict.Client/OpenIddictClientConfiguration.cs
index d8d2a589..c0095f19 100644
--- a/src/OpenIddict.Client/OpenIddictClientConfiguration.cs
+++ b/src/OpenIddict.Client/OpenIddictClientConfiguration.cs
@@ -53,7 +53,7 @@ public sealed class OpenIddictClientConfiguration : IPostConfigureOptions uri,
+ { IsAbsoluteUri: true } uri when !OpenIddictHelpers.IsImplicitFileUri(uri) => uri,
_ => null
};
@@ -2659,7 +2659,7 @@ public static partial class OpenIddictClientHandlers
// Ensure the token endpoint is present and is a valid absolute URI.
if (context.TokenEndpoint is not { IsAbsoluteUri: true } ||
- !context.TokenEndpoint.IsWellFormedOriginalString())
+ OpenIddictHelpers.IsImplicitFileUri(context.TokenEndpoint))
{
throw new InvalidOperationException(SR.FormatID0301(Metadata.TokenEndpoint));
}
@@ -3548,7 +3548,7 @@ public static partial class OpenIddictClientHandlers
// this stage, try to extract it from the server configuration.
context.UserinfoEndpoint ??= context.Configuration.UserinfoEndpoint switch
{
- { IsAbsoluteUri: true } uri when uri.IsWellFormedOriginalString() => uri,
+ { IsAbsoluteUri: true } uri when !OpenIddictHelpers.IsImplicitFileUri(uri) => uri,
_ => null
};
@@ -3703,7 +3703,7 @@ public static partial class OpenIddictClientHandlers
// Ensure the userinfo endpoint is present and is a valid absolute URI.
if (context.UserinfoEndpoint is not { IsAbsoluteUri: true } ||
- !context.UserinfoEndpoint.IsWellFormedOriginalString())
+ OpenIddictHelpers.IsImplicitFileUri(context.UserinfoEndpoint))
{
throw new InvalidOperationException(SR.FormatID0301(Metadata.UserinfoEndpoint));
}
@@ -5405,7 +5405,7 @@ public static partial class OpenIddictClientHandlers
// at this stage, try to extract it from the server configuration.
context.DeviceAuthorizationEndpoint ??= context.Configuration.DeviceAuthorizationEndpoint switch
{
- { IsAbsoluteUri: true } uri when uri.IsWellFormedOriginalString() => uri,
+ { IsAbsoluteUri: true } uri when !OpenIddictHelpers.IsImplicitFileUri(uri) => uri,
_ => null
};
@@ -5734,7 +5734,7 @@ public static partial class OpenIddictClientHandlers
// Ensure the device authorization endpoint is present and is a valid absolute URI.
if (context.DeviceAuthorizationEndpoint is not { IsAbsoluteUri: true } ||
- !context.DeviceAuthorizationEndpoint.IsWellFormedOriginalString())
+ OpenIddictHelpers.IsImplicitFileUri(context.DeviceAuthorizationEndpoint))
{
throw new InvalidOperationException(SR.FormatID0301(Metadata.DeviceAuthorizationEndpoint));
}
@@ -6079,7 +6079,7 @@ public static partial class OpenIddictClientHandlers
// at this stage, try to extract it from the server configuration.
context.IntrospectionEndpoint ??= context.Configuration.IntrospectionEndpoint switch
{
- { IsAbsoluteUri: true } uri when uri.IsWellFormedOriginalString() => uri,
+ { IsAbsoluteUri: true } uri when !OpenIddictHelpers.IsImplicitFileUri(uri) => uri,
_ => null
};
@@ -6403,7 +6403,7 @@ public static partial class OpenIddictClientHandlers
// Ensure the introspection endpoint is present and is a valid absolute URI.
if (context.IntrospectionEndpoint is not { IsAbsoluteUri: true } ||
- !context.IntrospectionEndpoint.IsWellFormedOriginalString())
+ OpenIddictHelpers.IsImplicitFileUri(context.IntrospectionEndpoint))
{
throw new InvalidOperationException(SR.FormatID0301(Metadata.IntrospectionEndpoint));
}
@@ -6671,7 +6671,7 @@ public static partial class OpenIddictClientHandlers
// at this stage, try to extract it from the server configuration.
context.RevocationEndpoint ??= context.Configuration.RevocationEndpoint switch
{
- { IsAbsoluteUri: true } uri when uri.IsWellFormedOriginalString() => uri,
+ { IsAbsoluteUri: true } uri when !OpenIddictHelpers.IsImplicitFileUri(uri) => uri,
_ => null
};
@@ -6994,7 +6994,7 @@ public static partial class OpenIddictClientHandlers
// Ensure the revocation endpoint is present and is a valid absolute URI.
if (context.RevocationEndpoint is not { IsAbsoluteUri: true } ||
- !context.RevocationEndpoint.IsWellFormedOriginalString())
+ OpenIddictHelpers.IsImplicitFileUri(context.RevocationEndpoint))
{
throw new InvalidOperationException(SR.FormatID0301(Metadata.RevocationEndpoint));
}
diff --git a/src/OpenIddict.Client/OpenIddictClientRetriever.cs b/src/OpenIddict.Client/OpenIddictClientRetriever.cs
index 4f64455a..16d68715 100644
--- a/src/OpenIddict.Client/OpenIddictClientRetriever.cs
+++ b/src/OpenIddict.Client/OpenIddictClientRetriever.cs
@@ -7,6 +7,7 @@
using System.ComponentModel;
using System.Diagnostics.CodeAnalysis;
using Microsoft.IdentityModel.Protocols;
+using OpenIddict.Extensions;
namespace OpenIddict.Client;
@@ -43,7 +44,7 @@ public sealed class OpenIddictClientRetriever : IConfigurationRetriever : IOpenIddictApplication
}
// Ensure the URI is a valid absolute URI.
- if (!Uri.TryCreate(uri, UriKind.Absolute, out Uri? value) || !value.IsWellFormedOriginalString())
+ if (!Uri.TryCreate(uri, UriKind.Absolute, out Uri? value) || OpenIddictHelpers.IsImplicitFileUri(value))
{
throw new ArgumentException(SR.GetResourceString(SR.ID0214));
}
@@ -1109,7 +1109,7 @@ public class OpenIddictApplicationManager : IOpenIddictApplication
}
// Ensure the URI is a valid absolute URI.
- if (!Uri.TryCreate(uri, UriKind.Absolute, out Uri? value) || !value.IsWellFormedOriginalString())
+ if (!Uri.TryCreate(uri, UriKind.Absolute, out Uri? value) || OpenIddictHelpers.IsImplicitFileUri(value))
{
throw new ArgumentException(SR.GetResourceString(SR.ID0214));
}
@@ -1337,7 +1337,7 @@ public class OpenIddictApplicationManager : IOpenIddictApplication
}
// Ensure the URI is a valid absolute URI.
- if (!Uri.TryCreate(uri, UriKind.Absolute, out Uri? value) || !value.IsWellFormedOriginalString())
+ if (!Uri.TryCreate(uri, UriKind.Absolute, out Uri? value) || OpenIddictHelpers.IsImplicitFileUri(value))
{
yield return new ValidationResult(SR.GetResourceString(SR.ID2062));
diff --git a/src/OpenIddict.Server/OpenIddictServerBuilder.cs b/src/OpenIddict.Server/OpenIddictServerBuilder.cs
index 79015799..624c0e96 100644
--- a/src/OpenIddict.Server/OpenIddictServerBuilder.cs
+++ b/src/OpenIddict.Server/OpenIddictServerBuilder.cs
@@ -1038,7 +1038,7 @@ public sealed class OpenIddictServerBuilder
throw new ArgumentNullException(nameof(uris));
}
- if (Array.Exists(uris, static uri => !uri.IsWellFormedOriginalString()))
+ if (Array.Exists(uris, OpenIddictHelpers.IsImplicitFileUri))
{
throw new ArgumentException(SR.GetResourceString(SR.ID0072), nameof(uris));
}
@@ -1087,7 +1087,7 @@ public sealed class OpenIddictServerBuilder
throw new ArgumentNullException(nameof(uris));
}
- if (Array.Exists(uris, static uri => !uri.IsWellFormedOriginalString()))
+ if (Array.Exists(uris, OpenIddictHelpers.IsImplicitFileUri))
{
throw new ArgumentException(SR.GetResourceString(SR.ID0072), nameof(uris));
}
@@ -1136,7 +1136,7 @@ public sealed class OpenIddictServerBuilder
throw new ArgumentNullException(nameof(uris));
}
- if (Array.Exists(uris, static uri => !uri.IsWellFormedOriginalString()))
+ if (Array.Exists(uris, OpenIddictHelpers.IsImplicitFileUri))
{
throw new ArgumentException(SR.GetResourceString(SR.ID0072), nameof(uris));
}
@@ -1185,7 +1185,7 @@ public sealed class OpenIddictServerBuilder
throw new ArgumentNullException(nameof(uris));
}
- if (Array.Exists(uris, static uri => !uri.IsWellFormedOriginalString()))
+ if (Array.Exists(uris, OpenIddictHelpers.IsImplicitFileUri))
{
throw new ArgumentException(SR.GetResourceString(SR.ID0072), nameof(uris));
}
@@ -1234,7 +1234,7 @@ public sealed class OpenIddictServerBuilder
throw new ArgumentNullException(nameof(uris));
}
- if (Array.Exists(uris, static uri => !uri.IsWellFormedOriginalString()))
+ if (Array.Exists(uris, OpenIddictHelpers.IsImplicitFileUri))
{
throw new ArgumentException(SR.GetResourceString(SR.ID0072), nameof(uris));
}
@@ -1283,7 +1283,7 @@ public sealed class OpenIddictServerBuilder
throw new ArgumentNullException(nameof(uris));
}
- if (Array.Exists(uris, static uri => !uri.IsWellFormedOriginalString()))
+ if (Array.Exists(uris, OpenIddictHelpers.IsImplicitFileUri))
{
throw new ArgumentException(SR.GetResourceString(SR.ID0072), nameof(uris));
}
@@ -1332,7 +1332,7 @@ public sealed class OpenIddictServerBuilder
throw new ArgumentNullException(nameof(uris));
}
- if (Array.Exists(uris, static uri => !uri.IsWellFormedOriginalString()))
+ if (Array.Exists(uris, OpenIddictHelpers.IsImplicitFileUri))
{
throw new ArgumentException(SR.GetResourceString(SR.ID0072), nameof(uris));
}
@@ -1381,7 +1381,7 @@ public sealed class OpenIddictServerBuilder
throw new ArgumentNullException(nameof(uris));
}
- if (Array.Exists(uris, static uri => !uri.IsWellFormedOriginalString()))
+ if (Array.Exists(uris, OpenIddictHelpers.IsImplicitFileUri))
{
throw new ArgumentException(SR.GetResourceString(SR.ID0072), nameof(uris));
}
@@ -1430,7 +1430,7 @@ public sealed class OpenIddictServerBuilder
throw new ArgumentNullException(nameof(uris));
}
- if (Array.Exists(uris, static uri => !uri.IsWellFormedOriginalString()))
+ if (Array.Exists(uris, OpenIddictHelpers.IsImplicitFileUri))
{
throw new ArgumentException(SR.GetResourceString(SR.ID0072), nameof(uris));
}
@@ -1479,7 +1479,7 @@ public sealed class OpenIddictServerBuilder
throw new ArgumentNullException(nameof(uris));
}
- if (Array.Exists(uris, static uri => !uri.IsWellFormedOriginalString()))
+ if (Array.Exists(uris, OpenIddictHelpers.IsImplicitFileUri))
{
throw new ArgumentException(SR.GetResourceString(SR.ID0072), nameof(uris));
}
@@ -1832,7 +1832,7 @@ public sealed class OpenIddictServerBuilder
throw new ArgumentException(SR.FormatID0366(nameof(uri)), nameof(uri));
}
- if (!Uri.TryCreate(uri, UriKind.Absolute, out Uri? value) || !value.IsWellFormedOriginalString())
+ if (!Uri.TryCreate(uri, UriKind.Absolute, out Uri? value) || OpenIddictHelpers.IsImplicitFileUri(value))
{
throw new ArgumentException(SR.GetResourceString(SR.ID0144), nameof(uri));
}
diff --git a/src/OpenIddict.Server/OpenIddictServerHandlers.Authentication.cs b/src/OpenIddict.Server/OpenIddictServerHandlers.Authentication.cs
index 62e7f7a9..933a8dcd 100644
--- a/src/OpenIddict.Server/OpenIddictServerHandlers.Authentication.cs
+++ b/src/OpenIddict.Server/OpenIddictServerHandlers.Authentication.cs
@@ -509,12 +509,7 @@ public static partial class OpenIddictServerHandlers
// Note: when specified, redirect_uri MUST be an absolute URI.
// See http://tools.ietf.org/html/rfc6749#section-3.1.2
// and http://openid.net/specs/openid-connect-core-1_0.html#AuthRequest.
- //
- // Note: on Linux/macOS, "/path" URIs are treated as valid absolute file URIs.
- // To ensure relative redirect_uris are correctly rejected on these platforms,
- // an additional check using IsWellFormedOriginalString() is made here.
- // See https://github.com/dotnet/corefx/issues/22098 for more information.
- if (!Uri.TryCreate(context.RedirectUri, UriKind.Absolute, out Uri? uri) || !uri.IsWellFormedOriginalString())
+ if (!Uri.TryCreate(context.RedirectUri, UriKind.Absolute, out Uri? uri) || OpenIddictHelpers.IsImplicitFileUri(uri))
{
context.Logger.LogInformation(SR.GetResourceString(SR.ID6034), Parameters.RedirectUri, context.RedirectUri);
diff --git a/src/OpenIddict.Server/OpenIddictServerHandlers.Session.cs b/src/OpenIddict.Server/OpenIddictServerHandlers.Session.cs
index 610a23ff..3d9ee122 100644
--- a/src/OpenIddict.Server/OpenIddictServerHandlers.Session.cs
+++ b/src/OpenIddict.Server/OpenIddictServerHandlers.Session.cs
@@ -11,6 +11,7 @@ using System.Security.Claims;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Options;
+using OpenIddict.Extensions;
namespace OpenIddict.Server;
@@ -346,7 +347,7 @@ public static partial class OpenIddictServerHandlers
}
// If an optional post_logout_redirect_uri was provided, validate it.
- if (!Uri.TryCreate(context.PostLogoutRedirectUri, UriKind.Absolute, out Uri? uri) || !uri.IsWellFormedOriginalString())
+ if (!Uri.TryCreate(context.PostLogoutRedirectUri, UriKind.Absolute, out Uri? uri) || OpenIddictHelpers.IsImplicitFileUri(uri))
{
context.Logger.LogInformation(SR.GetResourceString(SR.ID6126), Parameters.PostLogoutRedirectUri, context.PostLogoutRedirectUri);
diff --git a/src/OpenIddict.Server/OpenIddictServerHandlers.cs b/src/OpenIddict.Server/OpenIddictServerHandlers.cs
index 76b5422c..6e939bc5 100644
--- a/src/OpenIddict.Server/OpenIddictServerHandlers.cs
+++ b/src/OpenIddict.Server/OpenIddictServerHandlers.cs
@@ -185,8 +185,8 @@ public static partial class OpenIddictServerHandlers
else
{
var uri = OpenIddictHelpers.CreateAbsoluteUri(context.BaseUri, candidate);
- if (uri.IsWellFormedOriginalString() &&
- OpenIddictHelpers.IsBaseOf(context.BaseUri, uri) && Equals(uri, context.RequestUri))
+ if (!OpenIddictHelpers.IsImplicitFileUri(uri) &&
+ OpenIddictHelpers.IsBaseOf(context.BaseUri, uri) && Equals(uri, context.RequestUri))
{
return true;
}
@@ -845,7 +845,7 @@ public static partial class OpenIddictServerHandlers
foreach (var audience in audiences)
{
// Ignore the iterated audience if it's not a valid absolute URI.
- if (!Uri.TryCreate(audience, UriKind.Absolute, out Uri? uri) || !uri.IsWellFormedOriginalString())
+ if (!Uri.TryCreate(audience, UriKind.Absolute, out Uri? uri) || OpenIddictHelpers.IsImplicitFileUri(uri))
{
continue;
}
diff --git a/src/OpenIddict.Validation/OpenIddictValidationBuilder.cs b/src/OpenIddict.Validation/OpenIddictValidationBuilder.cs
index 89e96533..fae27ea2 100644
--- a/src/OpenIddict.Validation/OpenIddictValidationBuilder.cs
+++ b/src/OpenIddict.Validation/OpenIddictValidationBuilder.cs
@@ -11,6 +11,7 @@ using System.Runtime.InteropServices;
using System.Security.Cryptography.X509Certificates;
using Microsoft.Extensions.DependencyInjection.Extensions;
using Microsoft.IdentityModel.Tokens;
+using OpenIddict.Extensions;
using OpenIddict.Validation;
namespace Microsoft.Extensions.DependencyInjection;
@@ -711,7 +712,7 @@ public sealed class OpenIddictValidationBuilder
throw new ArgumentException(SR.GetResourceString(SR.ID0126), nameof(uri));
}
- if (!Uri.TryCreate(uri, UriKind.Absolute, out Uri? value) || !value.IsWellFormedOriginalString())
+ if (!Uri.TryCreate(uri, UriKind.Absolute, out Uri? value) || OpenIddictHelpers.IsImplicitFileUri(value))
{
throw new ArgumentException(SR.GetResourceString(SR.ID0023), nameof(uri));
}
diff --git a/src/OpenIddict.Validation/OpenIddictValidationConfiguration.cs b/src/OpenIddict.Validation/OpenIddictValidationConfiguration.cs
index 70421dd2..f6fa86c8 100644
--- a/src/OpenIddict.Validation/OpenIddictValidationConfiguration.cs
+++ b/src/OpenIddict.Validation/OpenIddictValidationConfiguration.cs
@@ -39,14 +39,14 @@ public sealed class OpenIddictValidationConfiguration : IPostConfigureOptions uri,
+ { IsAbsoluteUri: true } uri when !OpenIddictHelpers.IsImplicitFileUri(uri) => uri,
_ => null
};
@@ -542,7 +542,7 @@ public static partial class OpenIddictValidationHandlers
// Ensure the introspection endpoint is present and is a valid absolute URI.
if (context.IntrospectionEndpoint is not { IsAbsoluteUri: true } ||
- !context.IntrospectionEndpoint.IsWellFormedOriginalString())
+ OpenIddictHelpers.IsImplicitFileUri(context.IntrospectionEndpoint))
{
throw new InvalidOperationException(SR.FormatID0301(Metadata.IntrospectionEndpoint));
}
diff --git a/src/OpenIddict.Validation/OpenIddictValidationRetriever.cs b/src/OpenIddict.Validation/OpenIddictValidationRetriever.cs
index 2d3bbe8d..d2bfff47 100644
--- a/src/OpenIddict.Validation/OpenIddictValidationRetriever.cs
+++ b/src/OpenIddict.Validation/OpenIddictValidationRetriever.cs
@@ -7,6 +7,7 @@
using System.ComponentModel;
using System.Diagnostics.CodeAnalysis;
using Microsoft.IdentityModel.Protocols;
+using OpenIddict.Extensions;
namespace OpenIddict.Validation;
@@ -37,7 +38,7 @@ public sealed class OpenIddictValidationRetriever : IConfigurationRetriever