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