Browse Source

fix: Fix the MySQL token cleanup issue

- After querying the expired token collection, then delete it
pull/1491/head
colin 4 months ago
parent
commit
c94b098415
  1. 7
      aspnet-core/migrations/LY.MicroService.Applications.Single.EntityFrameworkCore.MySql/SingleMigrationsEntityFrameworkCoreMySqlModule.cs
  2. 39
      aspnet-core/migrations/LY.MicroService.Applications.Single.EntityFrameworkCore.MySql/Volo/Abp/OpenIddict/Tokens/EfCoreMySqlOpenIddictTokenRepository.cs

7
aspnet-core/migrations/LY.MicroService.Applications.Single.EntityFrameworkCore.MySql/SingleMigrationsEntityFrameworkCoreMySqlModule.cs

@ -8,6 +8,8 @@ using System;
using Volo.Abp.EntityFrameworkCore;
using Volo.Abp.Guids;
using Volo.Abp.Modularity;
using Volo.Abp.OpenIddict.EntityFrameworkCore;
using Volo.Abp.OpenIddict.Tokens;
namespace LY.MicroService.Applications.Single.EntityFrameworkCore.MySql;
@ -64,6 +66,11 @@ public class SingleMigrationsEntityFrameworkCoreMySqlModule : AbpModule
options.DefaultSequentialGuidType = SequentialGuidType.SequentialAsString;
}
});
context.Services.AddAbpDbContext<OpenIddictDbContext>(options =>
{
options.AddRepository<OpenIddictToken, EfCoreMySqlOpenIddictTokenRepository>();
});
}
}
}

39
aspnet-core/migrations/LY.MicroService.Applications.Single.EntityFrameworkCore.MySql/Volo/Abp/OpenIddict/Tokens/EfCoreMySqlOpenIddictTokenRepository.cs

@ -0,0 +1,39 @@
using Microsoft.EntityFrameworkCore;
using OpenIddict.Abstractions;
using System;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
using Volo.Abp.EntityFrameworkCore;
using Volo.Abp.OpenIddict.Authorizations;
using Volo.Abp.OpenIddict.EntityFrameworkCore;
namespace Volo.Abp.OpenIddict.Tokens;
public class EfCoreMySqlOpenIddictTokenRepository : EfCoreOpenIddictTokenRepository
{
public EfCoreMySqlOpenIddictTokenRepository(
IDbContextProvider<IOpenIddictDbContext> dbContextProvider)
: base(dbContextProvider)
{
}
public async override Task<long> PruneAsync(DateTime date, CancellationToken cancellationToken = default)
{
var dbContext = await GetDbContextAsync();
var tokens = await (from token in dbContext.Set<OpenIddictToken>()
join authorization in dbContext.Set<OpenIddictAuthorization>()
on token.AuthorizationId equals authorization.Id into tokenAuthorizations
from tokenAuthorization in tokenAuthorizations.DefaultIfEmpty()
where token.CreationDate < date
where (token.Status != OpenIddictConstants.Statuses.Inactive && token.Status != OpenIddictConstants.Statuses.Valid) ||
(tokenAuthorization != null && tokenAuthorization.Status != OpenIddictConstants.Statuses.Valid) ||
token.ExpirationDate < DateTime.UtcNow
select token)
.ToListAsync(GetCancellationToken(cancellationToken));
await DeleteManyAsync(tokens, cancellationToken: GetCancellationToken(cancellationToken));
return tokens.Count;
}
}
Loading…
Cancel
Save