mirror of https://github.com/abpframework/abp.git
8 changed files with 226 additions and 2 deletions
@ -0,0 +1,42 @@ |
|||||
|
using System; |
||||
|
using System.Threading.Tasks; |
||||
|
using Microsoft.Extensions.Options; |
||||
|
using OpenIddict.Server; |
||||
|
using Volo.Abp.Text.Formatting; |
||||
|
|
||||
|
namespace Volo.Abp.OpenIddict.WildcardDomains; |
||||
|
|
||||
|
public abstract class AbpOpenIddictWildcardDomainBase<THandler, TContext> : IOpenIddictServerHandler<TContext> |
||||
|
where THandler : class, new() |
||||
|
where TContext : OpenIddictServerEvents.BaseContext |
||||
|
{ |
||||
|
protected THandler Handler { get; set; } |
||||
|
protected AbpOpenIddictWildcardDomainOptions WildcardDomainOptions { get; } |
||||
|
|
||||
|
protected AbpOpenIddictWildcardDomainBase(IOptions<AbpOpenIddictWildcardDomainOptions> wildcardDomainOptions, bool initHandler = true) |
||||
|
{ |
||||
|
WildcardDomainOptions = wildcardDomainOptions.Value; |
||||
|
if (initHandler) |
||||
|
{ |
||||
|
Handler = new THandler(); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
public abstract ValueTask HandleAsync(TContext context); |
||||
|
|
||||
|
protected virtual Task<bool> CheckWildcardDomainAsync(string url) |
||||
|
{ |
||||
|
var extractResult = FormattedStringValueExtracter.Extract(url, WildcardDomainOptions.WildcardDomainFormat, ignoreCase: true); |
||||
|
if (extractResult.IsMatch) |
||||
|
{ |
||||
|
return Task.FromResult(true); |
||||
|
} |
||||
|
|
||||
|
if (WildcardDomainOptions.WildcardDomainFormat.Replace("{0}.", "").IndexOf(url, StringComparison.OrdinalIgnoreCase) > 1) |
||||
|
{ |
||||
|
return Task.FromResult(true); |
||||
|
} |
||||
|
|
||||
|
return Task.FromResult(false); |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,8 @@ |
|||||
|
namespace Volo.Abp.OpenIddict.WildcardDomains; |
||||
|
|
||||
|
public class AbpOpenIddictWildcardDomainOptions |
||||
|
{ |
||||
|
public bool EnableWildcardDomainSupport { get; set; } |
||||
|
|
||||
|
public string WildcardDomainFormat { get; set; } |
||||
|
} |
||||
@ -0,0 +1,39 @@ |
|||||
|
using System.Threading.Tasks; |
||||
|
using Microsoft.Extensions.Options; |
||||
|
using OpenIddict.Abstractions; |
||||
|
using OpenIddict.Server; |
||||
|
|
||||
|
namespace Volo.Abp.OpenIddict.WildcardDomains; |
||||
|
|
||||
|
public class AbpValidateClientPostLogoutRedirectUri : AbpOpenIddictWildcardDomainBase<OpenIddictServerHandlers.Session.ValidateClientPostLogoutRedirectUri, OpenIddictServerEvents.ValidateLogoutRequestContext> |
||||
|
{ |
||||
|
public static OpenIddictServerHandlerDescriptor Descriptor { get; } |
||||
|
= OpenIddictServerHandlerDescriptor.CreateBuilder<OpenIddictServerEvents.ValidateLogoutRequestContext>() |
||||
|
.AddFilter<OpenIddictServerHandlerFilters.RequireDegradedModeDisabled>() |
||||
|
.AddFilter<OpenIddictServerHandlerFilters.RequirePostLogoutRedirectUriParameter>() |
||||
|
.UseScopedHandler<AbpValidateClientPostLogoutRedirectUri>() |
||||
|
.SetOrder(OpenIddictServerHandlers.Session.ValidatePostLogoutRedirectUriParameter.Descriptor.Order + 1_000) |
||||
|
.SetType(OpenIddictServerHandlerType.BuiltIn) |
||||
|
.Build(); |
||||
|
|
||||
|
public AbpValidateClientPostLogoutRedirectUri( |
||||
|
IOptions<AbpOpenIddictWildcardDomainOptions> wildcardDomainsOptions, |
||||
|
IOpenIddictApplicationManager applicationManager) |
||||
|
: base(wildcardDomainsOptions, false) |
||||
|
{ |
||||
|
Handler = new OpenIddictServerHandlers.Session.ValidateClientPostLogoutRedirectUri(applicationManager); |
||||
|
} |
||||
|
|
||||
|
public async override ValueTask HandleAsync(OpenIddictServerEvents.ValidateLogoutRequestContext context) |
||||
|
{ |
||||
|
Check.NotNull(context, nameof(context)); |
||||
|
Check.NotNullOrEmpty(context.PostLogoutRedirectUri, nameof(context.PostLogoutRedirectUri)); |
||||
|
|
||||
|
if (await CheckWildcardDomainAsync(context.PostLogoutRedirectUri)) |
||||
|
{ |
||||
|
return; |
||||
|
} |
||||
|
|
||||
|
await Handler.HandleAsync(context); |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,37 @@ |
|||||
|
using System.Threading.Tasks; |
||||
|
using Microsoft.Extensions.Options; |
||||
|
using OpenIddict.Abstractions; |
||||
|
using OpenIddict.Server; |
||||
|
|
||||
|
namespace Volo.Abp.OpenIddict.WildcardDomains; |
||||
|
|
||||
|
public class AbpValidateClientRedirectUri : AbpOpenIddictWildcardDomainBase<OpenIddictServerHandlers.Authentication.ValidateClientRedirectUri, OpenIddictServerEvents.ValidateAuthorizationRequestContext> |
||||
|
{ |
||||
|
public static OpenIddictServerHandlerDescriptor Descriptor { get; } |
||||
|
= OpenIddictServerHandlerDescriptor.CreateBuilder<OpenIddictServerEvents.ValidateAuthorizationRequestContext>() |
||||
|
.AddFilter<OpenIddictServerHandlerFilters.RequireDegradedModeDisabled>() |
||||
|
.UseScopedHandler<AbpValidateClientRedirectUri>() |
||||
|
.SetOrder(OpenIddictServerHandlers.Authentication.ValidateClientType.Descriptor.Order + 1_000) |
||||
|
.SetType(OpenIddictServerHandlerType.BuiltIn) |
||||
|
.Build(); |
||||
|
|
||||
|
public AbpValidateClientRedirectUri( |
||||
|
IOptions<AbpOpenIddictWildcardDomainOptions> wildcardDomainsOptions, |
||||
|
IOpenIddictApplicationManager applicationManager) |
||||
|
: base(wildcardDomainsOptions, false) |
||||
|
{ |
||||
|
Handler = new OpenIddictServerHandlers.Authentication.ValidateClientRedirectUri(applicationManager); |
||||
|
} |
||||
|
|
||||
|
public async override ValueTask HandleAsync(OpenIddictServerEvents.ValidateAuthorizationRequestContext context) |
||||
|
{ |
||||
|
Check.NotNull(context, nameof(context)); |
||||
|
|
||||
|
if (!string.IsNullOrEmpty(context.RedirectUri) && await CheckWildcardDomainAsync(context.RedirectUri)) |
||||
|
{ |
||||
|
return; |
||||
|
} |
||||
|
|
||||
|
await Handler.HandleAsync(context); |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,32 @@ |
|||||
|
using System.Threading.Tasks; |
||||
|
using Microsoft.Extensions.Options; |
||||
|
using OpenIddict.Server; |
||||
|
|
||||
|
namespace Volo.Abp.OpenIddict.WildcardDomains; |
||||
|
|
||||
|
public class AbpValidatePostLogoutRedirectUriParameter : AbpOpenIddictWildcardDomainBase<OpenIddictServerHandlers.Session.ValidatePostLogoutRedirectUriParameter, OpenIddictServerEvents.ValidateLogoutRequestContext> |
||||
|
{ |
||||
|
public static OpenIddictServerHandlerDescriptor Descriptor { get; } |
||||
|
= OpenIddictServerHandlerDescriptor.CreateBuilder<OpenIddictServerEvents.ValidateLogoutRequestContext>() |
||||
|
.UseSingletonHandler<AbpValidatePostLogoutRedirectUriParameter>() |
||||
|
.SetOrder(int.MinValue + 100_000) |
||||
|
.SetType(OpenIddictServerHandlerType.BuiltIn) |
||||
|
.Build(); |
||||
|
|
||||
|
public AbpValidatePostLogoutRedirectUriParameter(IOptions<AbpOpenIddictWildcardDomainOptions> wildcardDomainsOptions) |
||||
|
: base(wildcardDomainsOptions) |
||||
|
{ |
||||
|
} |
||||
|
|
||||
|
public async override ValueTask HandleAsync(OpenIddictServerEvents.ValidateLogoutRequestContext context) |
||||
|
{ |
||||
|
Check.NotNull(context, nameof(context)); |
||||
|
|
||||
|
if (string.IsNullOrEmpty(context.PostLogoutRedirectUri) || await CheckWildcardDomainAsync(context.PostLogoutRedirectUri)) |
||||
|
{ |
||||
|
return; |
||||
|
} |
||||
|
|
||||
|
await Handler.HandleAsync(context); |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,32 @@ |
|||||
|
using System.Threading.Tasks; |
||||
|
using Microsoft.Extensions.Options; |
||||
|
using OpenIddict.Server; |
||||
|
|
||||
|
namespace Volo.Abp.OpenIddict.WildcardDomains; |
||||
|
|
||||
|
public class AbpValidateRedirectUriParameter : AbpOpenIddictWildcardDomainBase<OpenIddictServerHandlers.Authentication.ValidateRedirectUriParameter, OpenIddictServerEvents.ValidateAuthorizationRequestContext> |
||||
|
{ |
||||
|
public static OpenIddictServerHandlerDescriptor Descriptor { get; } |
||||
|
= OpenIddictServerHandlerDescriptor.CreateBuilder<OpenIddictServerEvents.ValidateAuthorizationRequestContext>() |
||||
|
.UseSingletonHandler<AbpValidateRedirectUriParameter>() |
||||
|
.SetOrder(OpenIddictServerHandlers.Authentication.ValidateClientIdParameter.Descriptor.Order + 1_000) |
||||
|
.SetType(OpenIddictServerHandlerType.BuiltIn) |
||||
|
.Build(); |
||||
|
|
||||
|
public AbpValidateRedirectUriParameter(IOptions<AbpOpenIddictWildcardDomainOptions> wildcardDomainsOptions) |
||||
|
: base(wildcardDomainsOptions) |
||||
|
{ |
||||
|
} |
||||
|
|
||||
|
public async override ValueTask HandleAsync(OpenIddictServerEvents.ValidateAuthorizationRequestContext context) |
||||
|
{ |
||||
|
Check.NotNull(context, nameof(context)); |
||||
|
|
||||
|
if (!string.IsNullOrEmpty(context.RedirectUri) && await CheckWildcardDomainAsync(context.RedirectUri)) |
||||
|
{ |
||||
|
return; |
||||
|
} |
||||
|
|
||||
|
await Handler.HandleAsync(context); |
||||
|
} |
||||
|
} |
||||
Loading…
Reference in new issue