From 7e396ed5406a08f77c2dbb47f4d946b19642a936 Mon Sep 17 00:00:00 2001 From: maliming Date: Fri, 17 Nov 2023 10:42:34 +0800 Subject: [PATCH] Handle the case where `DynamicClaims` is empty. --- .../Client/RemoteDynamicClaimsPrincipalContributor.cs | 6 ++++++ .../RemoteDynamicClaimsPrincipalContributorCache.cs | 4 ++-- .../IdentityDynamicClaimsPrincipalContributor.cs | 6 ++++++ .../IdentityDynamicClaimsPrincipalContributorCache.cs | 11 +++++++++++ 4 files changed, 25 insertions(+), 2 deletions(-) diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.Client.Common/Volo/Abp/AspNetCore/Mvc/Client/RemoteDynamicClaimsPrincipalContributor.cs b/framework/src/Volo.Abp.AspNetCore.Mvc.Client.Common/Volo/Abp/AspNetCore/Mvc/Client/RemoteDynamicClaimsPrincipalContributor.cs index d9339b57df..2ab437b319 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc.Client.Common/Volo/Abp/AspNetCore/Mvc/Client/RemoteDynamicClaimsPrincipalContributor.cs +++ b/framework/src/Volo.Abp.AspNetCore.Mvc.Client.Common/Volo/Abp/AspNetCore/Mvc/Client/RemoteDynamicClaimsPrincipalContributor.cs @@ -1,4 +1,5 @@ using System; +using System.Collections.Generic; using System.Linq; using System.Security.Claims; using System.Security.Principal; @@ -39,6 +40,11 @@ public class RemoteDynamicClaimsPrincipalContributor : AbpDynamicClaimsPrincipal return; } + if (dynamicClaims.Claims.IsNullOrEmpty()) + { + return; + } + await AddDynamicClaimsAsync(context, identity, dynamicClaims.Claims); } } diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.Client.Common/Volo/Abp/AspNetCore/Mvc/Client/RemoteDynamicClaimsPrincipalContributorCache.cs b/framework/src/Volo.Abp.AspNetCore.Mvc.Client.Common/Volo/Abp/AspNetCore/Mvc/Client/RemoteDynamicClaimsPrincipalContributorCache.cs index e9b03e847c..9dac39c786 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc.Client.Common/Volo/Abp/AspNetCore/Mvc/Client/RemoteDynamicClaimsPrincipalContributorCache.cs +++ b/framework/src/Volo.Abp.AspNetCore.Mvc.Client.Common/Volo/Abp/AspNetCore/Mvc/Client/RemoteDynamicClaimsPrincipalContributorCache.cs @@ -62,11 +62,11 @@ public class RemoteDynamicClaimsPrincipalContributorCache : ITransientDependency } dynamicClaims = await Cache.GetAsync(AbpDynamicClaimCacheItem.CalculateCacheKey(userId, tenantId)); - if (dynamicClaims == null || dynamicClaims.Claims.IsNullOrEmpty()) + if (dynamicClaims == null) { throw new AbpException($"Failed to refresh remote claims for user: {userId}"); } - return dynamicClaims!; + return dynamicClaims; } } diff --git a/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/IdentityDynamicClaimsPrincipalContributor.cs b/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/IdentityDynamicClaimsPrincipalContributor.cs index 7d56a3b184..94a55b205e 100644 --- a/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/IdentityDynamicClaimsPrincipalContributor.cs +++ b/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/IdentityDynamicClaimsPrincipalContributor.cs @@ -1,3 +1,4 @@ +using System.Collections.Generic; using System.Linq; using System.Security.Claims; using System.Security.Principal; @@ -34,6 +35,11 @@ public class IdentityDynamicClaimsPrincipalContributor : AbpDynamicClaimsPrincip return; } + if (dynamicClaims.Claims.IsNullOrEmpty()) + { + return; + } + await AddDynamicClaimsAsync(context, identity, dynamicClaims.Claims); } } diff --git a/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/IdentityDynamicClaimsPrincipalContributorCache.cs b/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/IdentityDynamicClaimsPrincipalContributorCache.cs index b0ab885e03..74d395e692 100644 --- a/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/IdentityDynamicClaimsPrincipalContributorCache.cs +++ b/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/IdentityDynamicClaimsPrincipalContributorCache.cs @@ -47,6 +47,17 @@ public class IdentityDynamicClaimsPrincipalContributorCache : ITransientDependen { Logger.LogDebug($"Get dynamic claims cache for user: {userId}"); + if (AbpClaimsPrincipalFactoryOptions.Value.DynamicClaims.IsNullOrEmpty()) + { + var emptyCacheItem = new AbpDynamicClaimCacheItem(); + await Cache.SetAsync(AbpDynamicClaimCacheItem.CalculateCacheKey(userId, tenantId), emptyCacheItem, new DistributedCacheEntryOptions + { + AbsoluteExpirationRelativeToNow = CacheOptions.Value.CacheAbsoluteExpiration + }); + + return emptyCacheItem; + } + return await Cache.GetOrAddAsync(AbpDynamicClaimCacheItem.CalculateCacheKey(userId, tenantId), async () => { using (CurrentTenant.Change(tenantId))