mirror of
https://github.com/streetwriters/notesnook-sync-server.git
synced 2026-09-27 08:51:44 +02:00
identity: use Quartz.NET for token cleanup
This commit is contained in:
@@ -0,0 +1,78 @@
|
||||
// Copyright (c) Brock Allen & Dominick Baier. All rights reserved.
|
||||
// Licensed under the Apache License, Version 2.0. See LICENSE in the project root for license information.
|
||||
|
||||
|
||||
using IdentityServer4.MongoDB;
|
||||
using IdentityServer4.MongoDB.Configuration;
|
||||
using IdentityServer4.MongoDB.DbContexts;
|
||||
using IdentityServer4.MongoDB.Entities;
|
||||
using IdentityServer4.MongoDB.Interfaces;
|
||||
using Microsoft.Extensions.Options;
|
||||
using MongoDB.Driver;
|
||||
using System;
|
||||
using System.Linq;
|
||||
using System.Linq.Expressions;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace Streetwriters.Identity.Services
|
||||
{
|
||||
public class CustomPersistedGrantDbContext : MongoDBContextBase, IPersistedGrantDbContext
|
||||
{
|
||||
private readonly IMongoCollection<PersistedGrant> _persistedGrants;
|
||||
|
||||
public CustomPersistedGrantDbContext(IOptions<MongoDBConfiguration> settings)
|
||||
: base(settings)
|
||||
{
|
||||
_persistedGrants = Database.GetCollection<PersistedGrant>(Constants.TableNames.PersistedGrant);
|
||||
CreateIndexes();
|
||||
}
|
||||
|
||||
private void CreateIndexes()
|
||||
{
|
||||
var indexOptions = new CreateIndexOptions() { Background = true };
|
||||
var builder = Builders<PersistedGrant>.IndexKeys;
|
||||
|
||||
var expirationIndexModel = new CreateIndexModel<PersistedGrant>(builder.Descending(_ => _.Expiration), indexOptions);
|
||||
var keyIndexModel = new CreateIndexModel<PersistedGrant>(builder.Ascending(_ => _.Key), indexOptions);
|
||||
var subIndexModel = new CreateIndexModel<PersistedGrant>(builder.Ascending(_ => _.SubjectId), indexOptions);
|
||||
var clientIdSubIndexModel = new CreateIndexModel<PersistedGrant>(
|
||||
builder.Combine(
|
||||
builder.Ascending(_ => _.ClientId),
|
||||
builder.Ascending(_ => _.SubjectId)),
|
||||
indexOptions);
|
||||
|
||||
var clientIdSubTypeIndexModel = new CreateIndexModel<PersistedGrant>(
|
||||
builder.Combine(
|
||||
builder.Ascending(_ => _.ClientId),
|
||||
builder.Ascending(_ => _.SubjectId),
|
||||
builder.Ascending(_ => _.Type)),
|
||||
indexOptions);
|
||||
|
||||
_persistedGrants.Indexes.CreateOne(expirationIndexModel);
|
||||
_persistedGrants.Indexes.CreateOne(keyIndexModel);
|
||||
_persistedGrants.Indexes.CreateOne(subIndexModel);
|
||||
_persistedGrants.Indexes.CreateOne(clientIdSubIndexModel);
|
||||
_persistedGrants.Indexes.CreateOne(clientIdSubTypeIndexModel);
|
||||
}
|
||||
|
||||
public IQueryable<PersistedGrant> PersistedGrants
|
||||
{
|
||||
get { return _persistedGrants.AsQueryable(); }
|
||||
}
|
||||
|
||||
public Task Remove(Expression<Func<PersistedGrant, bool>> filter)
|
||||
{
|
||||
return _persistedGrants.DeleteManyAsync(filter);
|
||||
}
|
||||
|
||||
public Task RemoveExpired()
|
||||
{
|
||||
return Remove(x => x.Expiration < DateTime.UtcNow.AddHours(12));
|
||||
}
|
||||
|
||||
public Task InsertOrUpdate(Expression<Func<PersistedGrant, bool>> filter, PersistedGrant entity)
|
||||
{
|
||||
return _persistedGrants.ReplaceOneAsync(filter, entity, new ReplaceOptions() { IsUpsert = true });
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,51 @@
|
||||
// Copyright (c) Brock Allen & Dominick Baier. All rights reserved.
|
||||
// Licensed under the Apache License, Version 2.0. See LICENSE in the project root for license information.
|
||||
|
||||
using IdentityServer4.MongoDB.Interfaces;
|
||||
using Microsoft.Extensions.Logging;
|
||||
using System;
|
||||
using System.Linq;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace Streetwriters.Identity.Services
|
||||
{
|
||||
public class TokenCleanup
|
||||
{
|
||||
private readonly IPersistedGrantDbContext _persistedGrantDbContext;
|
||||
private readonly ILogger<TokenCleanup> _logger;
|
||||
|
||||
public TokenCleanup(IPersistedGrantDbContext persistedGrantDbContext, ILogger<TokenCleanup> logger)
|
||||
{
|
||||
_persistedGrantDbContext = persistedGrantDbContext;
|
||||
_logger = logger ?? throw new ArgumentNullException(nameof(logger));
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Method to clear expired persisted grants.
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
public async Task RemoveExpiredGrantsAsync()
|
||||
{
|
||||
try
|
||||
{
|
||||
_logger.LogTrace("Querying for expired grants to remove");
|
||||
|
||||
await RemoveGrantsAsync();
|
||||
//TODO: await RemoveDeviceCodesAsync();
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
_logger.LogError("Exception removing expired grants: {exception}", ex.Message);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Removes the stale persisted grants.
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
protected virtual async Task RemoveGrantsAsync()
|
||||
{
|
||||
await _persistedGrantDbContext.RemoveExpired();
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user