From bb36aec36371c947eff7b044f24c0e56e49baef1 Mon Sep 17 00:00:00 2001 From: maliming Date: Fri, 10 Nov 2023 21:57:44 +0800 Subject: [PATCH] Add `AbpDynamicClaimsPrincipalContributorBase_Tests`. --- ...bpDynamicClaimsPrincipalContributorBase.cs | 25 +----- ....cs => AbpClaimsPrincipalFactory_Tests.cs} | 4 +- ...micClaimsPrincipalContributorBase_Tests.cs | 77 +++++++++++++++++++ ...t.cs => CurrentPrincipalAccessor_Tests.cs} | 4 +- 4 files changed, 84 insertions(+), 26 deletions(-) rename framework/test/Volo.Abp.Security.Tests/Volo/Abp/Security/Claims/{AbpClaimsPrincipalFactory_Test.cs => AbpClaimsPrincipalFactory_Tests.cs} (98%) create mode 100644 framework/test/Volo.Abp.Security.Tests/Volo/Abp/Security/Claims/AbpDynamicClaimsPrincipalContributorBase_Tests.cs rename framework/test/Volo.Abp.Security.Tests/Volo/Abp/Security/Claims/{CurrentPrincipalAccessor_Test.cs => CurrentPrincipalAccessor_Tests.cs} (91%) diff --git a/framework/src/Volo.Abp.Security/Volo/Abp/Security/Claims/AbpDynamicClaimsPrincipalContributorBase.cs b/framework/src/Volo.Abp.Security/Volo/Abp/Security/Claims/AbpDynamicClaimsPrincipalContributorBase.cs index 71ec0ae7c2..407dc8fca8 100644 --- a/framework/src/Volo.Abp.Security/Volo/Abp/Security/Claims/AbpDynamicClaimsPrincipalContributorBase.cs +++ b/framework/src/Volo.Abp.Security/Volo/Abp/Security/Claims/AbpDynamicClaimsPrincipalContributorBase.cs @@ -28,28 +28,9 @@ public abstract class AbpDynamicClaimsPrincipalContributorBase : IAbpDynamicClai return Task.CompletedTask; } - foreach (var claimGroup in claims.GroupBy(x => x.Type)) - { - var claim = claimGroup.First(); - if (claimGroup.Count() > 1) - { - dynamicClaims.RemoveAll(c => c.Type == claim.Type && identity.Claims.All(x => x.Type != claim.Type)); - identity.RemoveAll(abpClaimType); - identity.AddClaims(claimGroup.Where(c => c.Value != null).Select(c => new Claim(abpClaimType, c.Value!))); - } - else - { - dynamicClaims.RemoveAll(c => c.Type == claim.Type && identity.Claims.All(x => x.Type != claim.Type)); - if (claim.Value != null) - { - identity.AddOrReplace(new Claim(abpClaimType, claim.Value)); - } - else - { - identity.RemoveAll(abpClaimType); - } - } - } + dynamicClaims.RemoveAll(claims); + identity.RemoveAll(abpClaimType); + identity.AddClaims(claims.Where(c => c.Value != null).Select(c => new Claim(abpClaimType, c.Value!))); return Task.CompletedTask;; } diff --git a/framework/test/Volo.Abp.Security.Tests/Volo/Abp/Security/Claims/AbpClaimsPrincipalFactory_Test.cs b/framework/test/Volo.Abp.Security.Tests/Volo/Abp/Security/Claims/AbpClaimsPrincipalFactory_Tests.cs similarity index 98% rename from framework/test/Volo.Abp.Security.Tests/Volo/Abp/Security/Claims/AbpClaimsPrincipalFactory_Test.cs rename to framework/test/Volo.Abp.Security.Tests/Volo/Abp/Security/Claims/AbpClaimsPrincipalFactory_Tests.cs index 7726c2fe12..b8abaff000 100644 --- a/framework/test/Volo.Abp.Security.Tests/Volo/Abp/Security/Claims/AbpClaimsPrincipalFactory_Test.cs +++ b/framework/test/Volo.Abp.Security.Tests/Volo/Abp/Security/Claims/AbpClaimsPrincipalFactory_Tests.cs @@ -9,12 +9,12 @@ using Xunit; namespace Volo.Abp.Security.Claims; -public class AbpClaimsPrincipalFactory_Test : AbpIntegratedTest +public class AbpClaimsPrincipalFactory_Tests : AbpIntegratedTest { private readonly IAbpClaimsPrincipalFactory _abpClaimsPrincipalFactory; private static string TestAuthenticationType => "Identity.Application"; - public AbpClaimsPrincipalFactory_Test() + public AbpClaimsPrincipalFactory_Tests() { _abpClaimsPrincipalFactory = GetRequiredService(); diff --git a/framework/test/Volo.Abp.Security.Tests/Volo/Abp/Security/Claims/AbpDynamicClaimsPrincipalContributorBase_Tests.cs b/framework/test/Volo.Abp.Security.Tests/Volo/Abp/Security/Claims/AbpDynamicClaimsPrincipalContributorBase_Tests.cs new file mode 100644 index 0000000000..1e03008498 --- /dev/null +++ b/framework/test/Volo.Abp.Security.Tests/Volo/Abp/Security/Claims/AbpDynamicClaimsPrincipalContributorBase_Tests.cs @@ -0,0 +1,77 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Security.Claims; +using System.Threading.Tasks; +using Shouldly; +using Volo.Abp.Testing; +using Xunit; + +namespace Volo.Abp.Security.Claims; + +class TestAbpDynamicClaimsPrincipalContributor : AbpDynamicClaimsPrincipalContributorBase +{ + public async override Task ContributeAsync(AbpClaimsPrincipalContributorContext context) + { + var identity = context.ClaimsPrincipal.Identities.FirstOrDefault(); + Check.NotNull(identity, nameof(identity)); + + await MapCommonClaimsAsync(identity, AbpDynamicClaimsPrincipalContributorBase_Tests.DynamicClaims); + await AddDynamicClaims(identity, AbpDynamicClaimsPrincipalContributorBase_Tests.DynamicClaims); + } +} + +public class AbpDynamicClaimsPrincipalContributorBase_Tests : AbpIntegratedTest +{ + private readonly TestAbpDynamicClaimsPrincipalContributor _dynamicClaimsPrincipalContributorBase = new TestAbpDynamicClaimsPrincipalContributor(); + + public readonly static List DynamicClaims = new List(); + + protected override void SetAbpApplicationCreationOptions(AbpApplicationCreationOptions options) + { + options.UseAutofac(); + } + + [Fact] + public async Task CreateAsync() + { + var claimsPrincipal = new ClaimsPrincipal(new ClaimsIdentity()); + claimsPrincipal.Identities.First().AddClaim(new Claim(AbpClaimTypes.UserName, "test-source-userName")); + claimsPrincipal.Identities.First().AddClaim(new Claim(AbpClaimTypes.Name, "test-source-name")); + claimsPrincipal.Identities.First().AddClaim(new Claim(AbpClaimTypes.SurName, "test-source-surname")); + claimsPrincipal.Identities.First().AddClaim(new Claim(AbpClaimTypes.Role, "test-source-role1")); + claimsPrincipal.Identities.First().AddClaim(new Claim(AbpClaimTypes.Role, "test-source-role2")); + claimsPrincipal.Identities.First().AddClaim(new Claim(AbpClaimTypes.Email, "test-source-email")); + claimsPrincipal.Identities.First().AddClaim(new Claim(AbpClaimTypes.EmailVerified, "test-source-emailVerified")); + claimsPrincipal.Identities.First().AddClaim(new Claim(AbpClaimTypes.PhoneNumber, "test-source-phoneNumber")); + claimsPrincipal.Identities.First().AddClaim(new Claim(AbpClaimTypes.PhoneNumberVerified, "test-source-phoneNumberVerified")); + + claimsPrincipal.Identities.First().AddClaim(new Claim("my-claim", "test-source-my-claim")); + + DynamicClaims.AddRange(new [] + { + new AbpClaimCacheItem("preferred_username", "test-preferred_username"), + new AbpClaimCacheItem(ClaimTypes.GivenName, "test-given_name"), + new AbpClaimCacheItem("family_name", "test-family_name"), + new AbpClaimCacheItem("role", "test-role1"), + new AbpClaimCacheItem("roles", "test-role2"), + new AbpClaimCacheItem(ClaimTypes.Role, "test-role3"), + new AbpClaimCacheItem("email", "test-email"), + new AbpClaimCacheItem(AbpClaimTypes.EmailVerified, "test-email-verified"), + new AbpClaimCacheItem(AbpClaimTypes.PhoneNumberVerified, null), + }); + + await _dynamicClaimsPrincipalContributorBase.ContributeAsync(new AbpClaimsPrincipalContributorContext(claimsPrincipal, GetRequiredService())); + + claimsPrincipal.Identities.First().Claims.ShouldContain(c => c.Type == AbpClaimTypes.UserName && c.Value == "test-preferred_username"); + claimsPrincipal.Identities.First().Claims.ShouldContain(c => c.Type == AbpClaimTypes.SurName && c.Value == "test-family_name"); + claimsPrincipal.Identities.First().Claims.ShouldContain(c => c.Type == AbpClaimTypes.Name && c.Value == "test-given_name"); + claimsPrincipal.Identities.First().Claims.ShouldContain(c => c.Type == AbpClaimTypes.Role && c.Value == "test-role1"); + claimsPrincipal.Identities.First().Claims.ShouldContain(c => c.Type == AbpClaimTypes.Role && c.Value == "test-role2"); + claimsPrincipal.Identities.First().Claims.ShouldContain(c => c.Type == AbpClaimTypes.Email && c.Value == "test-email"); + claimsPrincipal.Identities.First().Claims.ShouldContain(c => c.Type == AbpClaimTypes.EmailVerified && c.Value == "test-email-verified"); + claimsPrincipal.Identities.First().Claims.ShouldContain(c => c.Type == AbpClaimTypes.PhoneNumber && c.Value == "test-source-phoneNumber"); + claimsPrincipal.Identities.First().Claims.ShouldNotContain(c => c.Type == AbpClaimTypes.PhoneNumberVerified); + claimsPrincipal.Identities.First().Claims.ShouldContain(c => c.Type == "my-claim" && c.Value == "test-source-my-claim"); + } +} diff --git a/framework/test/Volo.Abp.Security.Tests/Volo/Abp/Security/Claims/CurrentPrincipalAccessor_Test.cs b/framework/test/Volo.Abp.Security.Tests/Volo/Abp/Security/Claims/CurrentPrincipalAccessor_Tests.cs similarity index 91% rename from framework/test/Volo.Abp.Security.Tests/Volo/Abp/Security/Claims/CurrentPrincipalAccessor_Test.cs rename to framework/test/Volo.Abp.Security.Tests/Volo/Abp/Security/Claims/CurrentPrincipalAccessor_Tests.cs index d7c87148f4..bbc18089be 100644 --- a/framework/test/Volo.Abp.Security.Tests/Volo/Abp/Security/Claims/CurrentPrincipalAccessor_Test.cs +++ b/framework/test/Volo.Abp.Security.Tests/Volo/Abp/Security/Claims/CurrentPrincipalAccessor_Tests.cs @@ -6,11 +6,11 @@ using Xunit; namespace Volo.Abp.Security.Claims; -public class CurrentPrincipalAccessor_Test : AbpIntegratedTest +public class CurrentPrincipalAccessor_Tests : AbpIntegratedTest { private readonly ICurrentPrincipalAccessor _currentPrincipalAccessor; - public CurrentPrincipalAccessor_Test() + public CurrentPrincipalAccessor_Tests() { _currentPrincipalAccessor = GetRequiredService(); }