From fcffb83d8fe04593c9e5293915b4b91aa1638bcf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?K=C3=A9vin=20Chalet?= Date: Wed, 20 Mar 2024 18:26:02 +0100 Subject: [PATCH] Remove Uri.IsWellFormedOriginalString()/Uri.IsWellFormedUriString() --- ...OpenIddictClientWebIntegrationGenerator.cs | 5 ++-- .../OpenIddictHelpers.cs | 20 ++++++++++++++ .../OpenIddictClientAspNetCoreHandlers.cs | 4 +-- .../OpenIddictClientOwinHandlers.cs | 4 +-- ...IddictClientSystemIntegrationActivation.cs | 3 ++- ...penIddictClientSystemIntegrationHelpers.cs | 7 ++--- .../OpenIddictClientBuilder.cs | 6 ++--- .../OpenIddictClientConfiguration.cs | 2 +- ...OpenIddictClientHandlers.Authentication.cs | 3 ++- .../OpenIddictClientHandlers.Device.cs | 9 ++++--- .../OpenIddictClientHandlers.Discovery.cs | 17 ++++++------ .../OpenIddictClientHandlers.Session.cs | 3 ++- .../OpenIddictClientHandlers.cs | 26 +++++++++---------- .../OpenIddictClientRetriever.cs | 3 ++- .../OpenIddictClientService.cs | 14 +++++----- .../Managers/OpenIddictApplicationManager.cs | 6 ++--- .../OpenIddictServerBuilder.cs | 22 ++++++++-------- ...OpenIddictServerHandlers.Authentication.cs | 7 +---- .../OpenIddictServerHandlers.Session.cs | 3 ++- .../OpenIddictServerHandlers.cs | 6 ++--- .../OpenIddictValidationBuilder.cs | 3 ++- .../OpenIddictValidationConfiguration.cs | 4 +-- .../OpenIddictValidationHandlers.Discovery.cs | 5 ++-- .../OpenIddictValidationHandlers.cs | 4 +-- .../OpenIddictValidationRetriever.cs | 3 ++- .../OpenIddictValidationService.cs | 3 ++- 26 files changed, 109 insertions(+), 83 deletions(-) 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