Browse Source

Reintroduce relaxed request paths comparisons

pull/870/head
Kévin Chalet 6 years ago
parent
commit
7a164b6550
  1. 38
      src/OpenIddict.Server.AspNetCore/OpenIddictServerAspNetCoreHandlers.cs
  2. 38
      src/OpenIddict.Server.Owin/OpenIddictServerOwinHandlers.cs

38
src/OpenIddict.Server.AspNetCore/OpenIddictServerAspNetCoreHandlers.cs

@ -92,21 +92,21 @@ namespace OpenIddict.Server.AspNetCore
}
context.EndpointType =
Matches(context.Options.AuthorizationEndpointUris) ? OpenIddictServerEndpointType.Authorization :
Matches(context.Options.ConfigurationEndpointUris) ? OpenIddictServerEndpointType.Configuration :
Matches(context.Options.CryptographyEndpointUris) ? OpenIddictServerEndpointType.Cryptography :
Matches(context.Options.DeviceEndpointUris) ? OpenIddictServerEndpointType.Device :
Matches(context.Options.IntrospectionEndpointUris) ? OpenIddictServerEndpointType.Introspection :
Matches(context.Options.LogoutEndpointUris) ? OpenIddictServerEndpointType.Logout :
Matches(context.Options.RevocationEndpointUris) ? OpenIddictServerEndpointType.Revocation :
Matches(context.Options.TokenEndpointUris) ? OpenIddictServerEndpointType.Token :
Matches(context.Options.UserinfoEndpointUris) ? OpenIddictServerEndpointType.Userinfo :
Matches(context.Options.VerificationEndpointUris) ? OpenIddictServerEndpointType.Verification :
OpenIddictServerEndpointType.Unknown;
Matches(request, context.Options.AuthorizationEndpointUris) ? OpenIddictServerEndpointType.Authorization :
Matches(request, context.Options.ConfigurationEndpointUris) ? OpenIddictServerEndpointType.Configuration :
Matches(request, context.Options.CryptographyEndpointUris) ? OpenIddictServerEndpointType.Cryptography :
Matches(request, context.Options.DeviceEndpointUris) ? OpenIddictServerEndpointType.Device :
Matches(request, context.Options.IntrospectionEndpointUris) ? OpenIddictServerEndpointType.Introspection :
Matches(request, context.Options.LogoutEndpointUris) ? OpenIddictServerEndpointType.Logout :
Matches(request, context.Options.RevocationEndpointUris) ? OpenIddictServerEndpointType.Revocation :
Matches(request, context.Options.TokenEndpointUris) ? OpenIddictServerEndpointType.Token :
Matches(request, context.Options.UserinfoEndpointUris) ? OpenIddictServerEndpointType.Userinfo :
Matches(request, context.Options.VerificationEndpointUris) ? OpenIddictServerEndpointType.Verification :
OpenIddictServerEndpointType.Unknown;
return default;
bool Matches(IList<Uri> addresses)
static bool Matches(HttpRequest request, IList<Uri> addresses)
{
for (var index = 0; index < addresses.Count; index++)
{
@ -125,8 +125,7 @@ namespace OpenIddict.Server.AspNetCore
}
var path = PathString.FromUriComponent(address);
if (path == request.PathBase + request.Path ||
path == request.PathBase + request.Path + new PathString("/"))
if (AreEquivalent(path, request.PathBase + request.Path))
{
return true;
}
@ -135,7 +134,7 @@ namespace OpenIddict.Server.AspNetCore
else if (address.OriginalString.StartsWith("/", StringComparison.OrdinalIgnoreCase))
{
var path = new PathString(address.OriginalString);
if (path == request.Path || path == request.Path + new PathString("/"))
if (AreEquivalent(path, request.Path))
{
return true;
}
@ -143,6 +142,15 @@ namespace OpenIddict.Server.AspNetCore
}
return false;
// ASP.NET Core's routing system ignores trailing slashes when determining
// whether the request path matches a registered route, which is not the case
// with PathString, that treats /connect/token and /connect/token/ as different
// addresses. To mitigate this inconsistency, a manual check is used here.
static bool AreEquivalent(PathString left, PathString right)
=> left.Equals(right, StringComparison.OrdinalIgnoreCase) ||
left.Equals(right + "/", StringComparison.OrdinalIgnoreCase) ||
right.Equals(left + "/", StringComparison.OrdinalIgnoreCase);
}
}
}

38
src/OpenIddict.Server.Owin/OpenIddictServerOwinHandlers.cs

@ -92,21 +92,21 @@ namespace OpenIddict.Server.Owin
}
context.EndpointType =
Matches(context.Options.AuthorizationEndpointUris) ? OpenIddictServerEndpointType.Authorization :
Matches(context.Options.ConfigurationEndpointUris) ? OpenIddictServerEndpointType.Configuration :
Matches(context.Options.CryptographyEndpointUris) ? OpenIddictServerEndpointType.Cryptography :
Matches(context.Options.DeviceEndpointUris) ? OpenIddictServerEndpointType.Device :
Matches(context.Options.IntrospectionEndpointUris) ? OpenIddictServerEndpointType.Introspection :
Matches(context.Options.LogoutEndpointUris) ? OpenIddictServerEndpointType.Logout :
Matches(context.Options.RevocationEndpointUris) ? OpenIddictServerEndpointType.Revocation :
Matches(context.Options.TokenEndpointUris) ? OpenIddictServerEndpointType.Token :
Matches(context.Options.UserinfoEndpointUris) ? OpenIddictServerEndpointType.Userinfo :
Matches(context.Options.VerificationEndpointUris) ? OpenIddictServerEndpointType.Verification :
OpenIddictServerEndpointType.Unknown;
Matches(request, context.Options.AuthorizationEndpointUris) ? OpenIddictServerEndpointType.Authorization :
Matches(request, context.Options.ConfigurationEndpointUris) ? OpenIddictServerEndpointType.Configuration :
Matches(request, context.Options.CryptographyEndpointUris) ? OpenIddictServerEndpointType.Cryptography :
Matches(request, context.Options.DeviceEndpointUris) ? OpenIddictServerEndpointType.Device :
Matches(request, context.Options.IntrospectionEndpointUris) ? OpenIddictServerEndpointType.Introspection :
Matches(request, context.Options.LogoutEndpointUris) ? OpenIddictServerEndpointType.Logout :
Matches(request, context.Options.RevocationEndpointUris) ? OpenIddictServerEndpointType.Revocation :
Matches(request, context.Options.TokenEndpointUris) ? OpenIddictServerEndpointType.Token :
Matches(request, context.Options.UserinfoEndpointUris) ? OpenIddictServerEndpointType.Userinfo :
Matches(request, context.Options.VerificationEndpointUris) ? OpenIddictServerEndpointType.Verification :
OpenIddictServerEndpointType.Unknown;
return default;
bool Matches(IList<Uri> addresses)
static bool Matches(IOwinRequest request, IList<Uri> addresses)
{
for (var index = 0; index < addresses.Count; index++)
{
@ -125,8 +125,7 @@ namespace OpenIddict.Server.Owin
}
var path = PathString.FromUriComponent(address);
if (path == request.PathBase + request.Path ||
path == request.PathBase + request.Path + new PathString("/"))
if (AreEquivalent(path, request.PathBase + request.Path))
{
return true;
}
@ -135,7 +134,7 @@ namespace OpenIddict.Server.Owin
else if (address.OriginalString.StartsWith("/", StringComparison.OrdinalIgnoreCase))
{
var path = new PathString(address.OriginalString);
if (path == request.Path || path == request.Path + new PathString("/"))
if (AreEquivalent(path, request.Path))
{
return true;
}
@ -143,6 +142,15 @@ namespace OpenIddict.Server.Owin
}
return false;
// ASP.NET MVC's routing system ignores trailing slashes when determining
// whether the request path matches a registered route, which is not the case
// with PathString, that treats /connect/token and /connect/token/ as different
// addresses. To mitigate this inconsistency, a manual check is used here.
static bool AreEquivalent(PathString left, PathString right)
=> left.Equals(right, StringComparison.OrdinalIgnoreCase) ||
left.Equals(right + new PathString("/"), StringComparison.OrdinalIgnoreCase) ||
right.Equals(left + new PathString("/"), StringComparison.OrdinalIgnoreCase);
}
}
}

Loading…
Cancel
Save