diff --git a/modules/openiddict/src/Volo.Abp.OpenIddict.MongoDB/Volo/Abp/OpenIddict/Authorizations/MongoOpenIddictAuthorizationRepository.cs b/modules/openiddict/src/Volo.Abp.OpenIddict.MongoDB/Volo/Abp/OpenIddict/Authorizations/MongoOpenIddictAuthorizationRepository.cs index 0c7dbcf526..7225425581 100644 --- a/modules/openiddict/src/Volo.Abp.OpenIddict.MongoDB/Volo/Abp/OpenIddict/Authorizations/MongoOpenIddictAuthorizationRepository.cs +++ b/modules/openiddict/src/Volo.Abp.OpenIddict.MongoDB/Volo/Abp/OpenIddict/Authorizations/MongoOpenIddictAuthorizationRepository.cs @@ -16,8 +16,14 @@ namespace Volo.Abp.OpenIddict.Authorizations; public class MongoOpenIddictAuthorizationRepository : MongoDbRepository, IOpenIddictAuthorizationRepository { - public MongoOpenIddictAuthorizationRepository(IMongoDbContextProvider dbContextProvider) : base(dbContextProvider) + protected IMongoDbRepositoryFilterer TokenDbRepositoryFilterer { get; } + + public MongoOpenIddictAuthorizationRepository( + IMongoDbContextProvider dbContextProvider, + IMongoDbRepositoryFilterer tokenDbRepositoryFilterer) + : base(dbContextProvider) { + TokenDbRepositoryFilterer = tokenDbRepositoryFilterer; } public virtual async Task> FindAsync(string subject, Guid client, CancellationToken cancellationToken = default) @@ -67,14 +73,39 @@ public class MongoOpenIddictAuthorizationRepository : MongoDbRepository(cancellationToken)) + var tokenIds = await (await GetMongoQueryableAsync(cancellationToken)) .Where(x => x.AuthorizationId != null) .Select(x => x.AuthorizationId.Value) .ToListAsync(GetCancellationToken(cancellationToken)); - await DeleteManyAsync(await (await GetMongoQueryableAsync(cancellationToken)) + var authorizations = await (await GetMongoQueryableAsync(cancellationToken)) .Where(x => x.CreationDate < date) - .Where(x => x.Status != OpenIddictConstants.Statuses.Valid || (x.Type == OpenIddictConstants.AuthorizationTypes.AdHoc && !tokens.Contains(x.Id))) - .ToListAsync(cancellationToken: cancellationToken), cancellationToken: cancellationToken); + .Where(x => x.Status != OpenIddictConstants.Statuses.Valid || (x.Type == OpenIddictConstants.AuthorizationTypes.AdHoc && !tokenIds.Contains(x.Id))) + .Select(x => x.Id) + .ToListAsync(cancellationToken: cancellationToken); + + var tokens = await (await GetMongoQueryableAsync(cancellationToken)) + .Where(x => x.AuthorizationId != null && authorizations.Contains(x.AuthorizationId.Value)) + .ToListAsync(cancellationToken: cancellationToken); + + if (tokens.Any()) + { + var tokenDbContext = await GetDbContextAsync(cancellationToken); + if (tokenDbContext.SessionHandle != null) + { + await tokenDbContext.Collection().DeleteManyAsync( + tokenDbContext.SessionHandle, + await TokenDbRepositoryFilterer.CreateEntitiesFilterAsync(tokens), + cancellationToken: cancellationToken); + } + else + { + await tokenDbContext.Collection().DeleteManyAsync( + await TokenDbRepositoryFilterer.CreateEntitiesFilterAsync(tokens), + cancellationToken: cancellationToken); + } + } + + await DeleteManyAsync(authorizations, cancellationToken: cancellationToken); } }