From 483b1e9d6d57e309da75713934716097133860cf Mon Sep 17 00:00:00 2001 From: maliming Date: Fri, 4 Nov 2022 17:04:32 +0800 Subject: [PATCH] Add `AttachAbpCustomChallengeError`. Resolve #14484 --- .../AbpOpenIddictAspNetCoreModule.cs | 2 + .../AttachAbpCustomChallengeErrors.cs | 40 +++++++++++++++++++ 2 files changed, 42 insertions(+) create mode 100644 modules/openiddict/src/Volo.Abp.OpenIddict.AspNetCore/Volo/Abp/OpenIddict/Handlers/AttachAbpCustomChallengeErrors.cs diff --git a/modules/openiddict/src/Volo.Abp.OpenIddict.AspNetCore/Volo/Abp/OpenIddict/AbpOpenIddictAspNetCoreModule.cs b/modules/openiddict/src/Volo.Abp.OpenIddict.AspNetCore/Volo/Abp/OpenIddict/AbpOpenIddictAspNetCoreModule.cs index e8196627ce..76d780104b 100644 --- a/modules/openiddict/src/Volo.Abp.OpenIddict.AspNetCore/Volo/Abp/OpenIddict/AbpOpenIddictAspNetCoreModule.cs +++ b/modules/openiddict/src/Volo.Abp.OpenIddict.AspNetCore/Volo/Abp/OpenIddict/AbpOpenIddictAspNetCoreModule.cs @@ -5,6 +5,7 @@ using OpenIddict.Server; using Volo.Abp.AspNetCore.MultiTenancy; using Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared; using Volo.Abp.Modularity; +using Volo.Abp.OpenIddict.Handlers; using Volo.Abp.OpenIddict.WildcardDomains; using Volo.Abp.Security.Claims; @@ -129,6 +130,7 @@ public class AbpOpenIddictAspNetCoreModule : AbpModule builder.AddEventHandler(AbpValidatePostLogoutRedirectUriParameter.Descriptor); } + builder.AddEventHandler(AttachAbpCustomChallengeErrors.Descriptor); builder.AddEventHandler(RemoveClaimsFromClientCredentialsGrantType.Descriptor); services.ExecutePreConfiguredActions(builder); diff --git a/modules/openiddict/src/Volo.Abp.OpenIddict.AspNetCore/Volo/Abp/OpenIddict/Handlers/AttachAbpCustomChallengeErrors.cs b/modules/openiddict/src/Volo.Abp.OpenIddict.AspNetCore/Volo/Abp/OpenIddict/Handlers/AttachAbpCustomChallengeErrors.cs new file mode 100644 index 0000000000..1bea7d839b --- /dev/null +++ b/modules/openiddict/src/Volo.Abp.OpenIddict.AspNetCore/Volo/Abp/OpenIddict/Handlers/AttachAbpCustomChallengeErrors.cs @@ -0,0 +1,40 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using Microsoft.AspNetCore.Authentication; +using OpenIddict.Server; + +namespace Volo.Abp.OpenIddict.Handlers; + +public class AttachAbpCustomChallengeErrors : IOpenIddictServerHandler +{ + private static readonly List CustomChallengeErrors = new List() + { + "userId", + "twoFactorToken" + }; + + public static OpenIddictServerHandlerDescriptor Descriptor { get; } + = OpenIddictServerHandlerDescriptor.CreateBuilder() + .UseSingletonHandler() + .SetOrder(OpenIddictServerHandlers.AttachDefaultChallengeError.Descriptor.Order + 1) + .SetType(OpenIddictServerHandlerType.Custom) + .Build(); + + public ValueTask HandleAsync(OpenIddictServerEvents.ProcessChallengeContext context) + { + Check.NotNull(context, nameof(context)); + + var properties = context.Transaction.Properties[typeof(AuthenticationProperties).FullName!].As(); + if (properties != null) + { + foreach (var property in properties.Items.Where(x => CustomChallengeErrors.Contains(x.Key))) + { + context.Response.SetParameter(property.Key, property.Value); + } + } + + return default; + } +}