internal async Task StoreUserClaimsContainer(UserClaimsContainer userClaimsContainer, CancellationToken cancellationToken = default)
 {
     cancellationToken.ThrowIfCancellationRequested();
     ThrowIfDisposed();
     try
     {
         var normalizedId = userClaimsContainer.Payload.GetId();
         await identityDocumentStore.IdentitySession(async session => await session.StoreAsync(userClaimsContainer.SetId <UserClaimsContainer, Claim>(normalizedId), normalizedId, cancellationToken));
     }
     catch (Exception e)
     {
         logger.LogError(e, $"error StoreUserClaimsContainer user:{userClaimsContainer} ");
         throw;
     }
 }
 public override async Task ReplaceClaimAsync(TUser user, Claim claim, Claim newClaim, CancellationToken cancellationToken = default)
 {
     cancellationToken.ThrowIfCancellationRequested();
     ThrowIfDisposed();
     try
     {
         await RemoveClaimsAsync(user, new[] { claim }, cancellationToken);
         await EnsureUserClaimsContainer(UserClaimsContainer.Create(claim, user.Id), cancellationToken);
     }
     catch (Exception e)
     {
         logger.LogError(e, $"error AddClaimsAsync user:{user} ");
         throw;
     }
 }
        public override async Task AddClaimAsync(TRole role, Claim claim, CancellationToken cancellationToken = default)
        {
            cancellationToken.ThrowIfCancellationRequested();
            ThrowIfDisposed();
            try
            {
                var claimsContainer = new UserClaimsContainer {
                    id = claim.GetId(), Payload = claim
                }.AddRefs <UserClaimsContainer, Claim>(role.Id);

                await EnsureUserClaimsContainer(claimsContainer, cancellationToken);
            }
            catch (Exception e)
            {
                logger.LogError(e, $"error AddClaimsAsync role:{role} ");
                throw;
            }
        }
        internal async Task <UserClaimsContainer> EnsureUserClaimsContainer(UserClaimsContainer userClaimsContainer, CancellationToken cancellationToken = default)
        {
            cancellationToken.ThrowIfCancellationRequested();
            ThrowIfDisposed();
            try
            {
                var enureIdExist = userClaimsContainer.Payload.GetId();
                var ucc          = await identityDocumentStore.IdentitySession <UserClaimsContainer>(async session => await session.LoadAsync <UserClaimsContainer>(enureIdExist));

                if (ucc == null)
                {
                    await StoreUserClaimsContainer(userClaimsContainer.SetId <UserClaimsContainer, Claim>(enureIdExist), cancellationToken);

                    return(await EnsureUserClaimsContainer(userClaimsContainer, cancellationToken));
                }
                return(ucc);
            }
            catch (Exception e)
            {
                logger.LogError(e, $"error EnsureUserClaimsContainer user:{userClaimsContainer} ");
                throw;
            }
        }