diff --git a/src/OpenIddict.MongoDb/OpenIddictMongoDbContext.cs b/src/OpenIddict.MongoDb/OpenIddictMongoDbContext.cs index f7c9db60..be326df5 100644 --- a/src/OpenIddict.MongoDb/OpenIddictMongoDbContext.cs +++ b/src/OpenIddict.MongoDb/OpenIddictMongoDbContext.cs @@ -21,12 +21,12 @@ namespace OpenIddict.MongoDb /// public class OpenIddictMongoDbContext : IOpenIddictMongoDbContext { - private readonly IOptionsMonitor _options; + private readonly IOptions _options; private readonly IServiceProvider _provider; private IMongoDatabase _database; public OpenIddictMongoDbContext( - [NotNull] IOptionsMonitor options, + [NotNull] IOptions options, [NotNull] IServiceProvider provider) { _options = options; @@ -47,14 +47,14 @@ namespace OpenIddict.MongoDb return new ValueTask(_database); } - var options = _options.CurrentValue; - if (options == null) - { - throw new InvalidOperationException("The OpenIddict MongoDB options cannot be retrieved."); - } - async Task ExecuteAsync() { + var options = _options.Value; + if (options == null) + { + throw new InvalidOperationException("The OpenIddict MongoDB options cannot be retrieved."); + } + var database = options.Database; if (database == null) { diff --git a/src/OpenIddict.MongoDb/Stores/OpenIddictApplicationStore.cs b/src/OpenIddict.MongoDb/Stores/OpenIddictApplicationStore.cs index ea5738bb..066b0870 100644 --- a/src/OpenIddict.MongoDb/Stores/OpenIddictApplicationStore.cs +++ b/src/OpenIddict.MongoDb/Stores/OpenIddictApplicationStore.cs @@ -33,7 +33,7 @@ namespace OpenIddict.MongoDb public OpenIddictApplicationStore( [NotNull] IMemoryCache cache, [NotNull] IOpenIddictMongoDbContext context, - [NotNull] IOptionsMonitor options) + [NotNull] IOptions options) { Cache = cache; Context = context; @@ -53,7 +53,7 @@ namespace OpenIddict.MongoDb /// /// Gets the options associated with the current store. /// - protected IOptionsMonitor Options { get; } + protected IOptions Options { get; } /// /// Determines the number of applications that exist in the database. @@ -66,7 +66,7 @@ namespace OpenIddict.MongoDb public virtual async Task CountAsync(CancellationToken cancellationToken) { var database = await Context.GetDatabaseAsync(cancellationToken); - var collection = database.GetCollection(Options.CurrentValue.ApplicationsCollectionName); + var collection = database.GetCollection(Options.Value.ApplicationsCollectionName); return await collection.CountAsync(FilterDefinition.Empty); } @@ -89,7 +89,7 @@ namespace OpenIddict.MongoDb } var database = await Context.GetDatabaseAsync(cancellationToken); - var collection = database.GetCollection(Options.CurrentValue.ApplicationsCollectionName); + var collection = database.GetCollection(Options.Value.ApplicationsCollectionName); return await ((IMongoQueryable) query(collection.AsQueryable())).LongCountAsync(); } @@ -110,7 +110,7 @@ namespace OpenIddict.MongoDb } var database = await Context.GetDatabaseAsync(cancellationToken); - var collection = database.GetCollection(Options.CurrentValue.ApplicationsCollectionName); + var collection = database.GetCollection(Options.Value.ApplicationsCollectionName); await collection.InsertOneAsync(application, null, cancellationToken); } @@ -131,7 +131,7 @@ namespace OpenIddict.MongoDb } var database = await Context.GetDatabaseAsync(cancellationToken); - var collection = database.GetCollection(Options.CurrentValue.ApplicationsCollectionName); + var collection = database.GetCollection(Options.Value.ApplicationsCollectionName); if ((await collection.DeleteOneAsync(entity => entity.Id == application.Id && @@ -144,11 +144,11 @@ namespace OpenIddict.MongoDb } // Delete the authorizations associated with the application. - await database.GetCollection(Options.CurrentValue.AuthorizationsCollectionName) + await database.GetCollection(Options.Value.AuthorizationsCollectionName) .DeleteManyAsync(authorization => authorization.ApplicationId == application.Id, cancellationToken); // Delete the tokens associated with the application. - await database.GetCollection(Options.CurrentValue.TokensCollectionName) + await database.GetCollection(Options.Value.TokensCollectionName) .DeleteManyAsync(token => token.ApplicationId == application.Id, cancellationToken); } @@ -169,7 +169,7 @@ namespace OpenIddict.MongoDb } var database = await Context.GetDatabaseAsync(cancellationToken); - var collection = database.GetCollection(Options.CurrentValue.ApplicationsCollectionName); + var collection = database.GetCollection(Options.Value.ApplicationsCollectionName); return await collection.Find(application => application.ClientId == identifier).FirstOrDefaultAsync(cancellationToken); } @@ -191,7 +191,7 @@ namespace OpenIddict.MongoDb } var database = await Context.GetDatabaseAsync(cancellationToken); - var collection = database.GetCollection(Options.CurrentValue.ApplicationsCollectionName); + var collection = database.GetCollection(Options.Value.ApplicationsCollectionName); return await collection.Find(application => application.Id == ObjectId.Parse(identifier)).FirstOrDefaultAsync(cancellationToken); } @@ -213,7 +213,7 @@ namespace OpenIddict.MongoDb } var database = await Context.GetDatabaseAsync(cancellationToken); - var collection = database.GetCollection(Options.CurrentValue.ApplicationsCollectionName); + var collection = database.GetCollection(Options.Value.ApplicationsCollectionName); return ImmutableArray.CreateRange(await collection.Find(application => application.PostLogoutRedirectUris.Contains(address)).ToListAsync(cancellationToken)); @@ -236,7 +236,7 @@ namespace OpenIddict.MongoDb } var database = await Context.GetDatabaseAsync(cancellationToken); - var collection = database.GetCollection(Options.CurrentValue.ApplicationsCollectionName); + var collection = database.GetCollection(Options.Value.ApplicationsCollectionName); return ImmutableArray.CreateRange(await collection.Find(application => application.RedirectUris.Contains(address)).ToListAsync(cancellationToken)); @@ -264,7 +264,7 @@ namespace OpenIddict.MongoDb } var database = await Context.GetDatabaseAsync(cancellationToken); - var collection = database.GetCollection(Options.CurrentValue.ApplicationsCollectionName); + var collection = database.GetCollection(Options.Value.ApplicationsCollectionName); return await ((IMongoQueryable) query(collection.AsQueryable(), state)).FirstOrDefaultAsync(cancellationToken); } @@ -506,7 +506,7 @@ namespace OpenIddict.MongoDb [CanBeNull] int? count, [CanBeNull] int? offset, CancellationToken cancellationToken) { var database = await Context.GetDatabaseAsync(cancellationToken); - var collection = database.GetCollection(Options.CurrentValue.ApplicationsCollectionName); + var collection = database.GetCollection(Options.Value.ApplicationsCollectionName); var query = (IMongoQueryable) collection.AsQueryable().OrderBy(application => application.Id); @@ -545,7 +545,7 @@ namespace OpenIddict.MongoDb } var database = await Context.GetDatabaseAsync(cancellationToken); - var collection = database.GetCollection(Options.CurrentValue.ApplicationsCollectionName); + var collection = database.GetCollection(Options.Value.ApplicationsCollectionName); return ImmutableArray.CreateRange( await ((IMongoQueryable) query(collection.AsQueryable(), state)).ToListAsync(cancellationToken)); @@ -794,14 +794,15 @@ namespace OpenIddict.MongoDb // Generate a new concurrency token and attach it // to the application before persisting the changes. + var timestamp = application.ConcurrencyToken; application.ConcurrencyToken = Guid.NewGuid().ToString(); var database = await Context.GetDatabaseAsync(cancellationToken); - var collection = database.GetCollection(Options.CurrentValue.ApplicationsCollectionName); + var collection = database.GetCollection(Options.Value.ApplicationsCollectionName); if ((await collection.ReplaceOneAsync(entity => entity.Id == application.Id && - entity.ConcurrencyToken == application.ConcurrencyToken, application, null, cancellationToken)).MatchedCount == 0) + entity.ConcurrencyToken == timestamp, application, null, cancellationToken)).MatchedCount == 0) { throw new OpenIddictException(OpenIddictConstants.Exceptions.ConcurrencyError, new StringBuilder() .AppendLine("The application was concurrently updated and cannot be persisted in its current state.") diff --git a/src/OpenIddict.MongoDb/Stores/OpenIddictAuthorizationStore.cs b/src/OpenIddict.MongoDb/Stores/OpenIddictAuthorizationStore.cs index 353d11ae..8754d881 100644 --- a/src/OpenIddict.MongoDb/Stores/OpenIddictAuthorizationStore.cs +++ b/src/OpenIddict.MongoDb/Stores/OpenIddictAuthorizationStore.cs @@ -33,7 +33,7 @@ namespace OpenIddict.MongoDb public OpenIddictAuthorizationStore( [NotNull] IMemoryCache cache, [NotNull] IOpenIddictMongoDbContext context, - [NotNull] IOptionsMonitor options) + [NotNull] IOptions options) { Cache = cache; Context = context; @@ -53,7 +53,7 @@ namespace OpenIddict.MongoDb /// /// Gets the options associated with the current store. /// - protected IOptionsMonitor Options { get; } + protected IOptions Options { get; } /// /// Determines the number of authorizations that exist in the database. @@ -66,7 +66,7 @@ namespace OpenIddict.MongoDb public virtual async Task CountAsync(CancellationToken cancellationToken) { var database = await Context.GetDatabaseAsync(cancellationToken); - var collection = database.GetCollection(Options.CurrentValue.AuthorizationsCollectionName); + var collection = database.GetCollection(Options.Value.AuthorizationsCollectionName); return await collection.CountAsync(FilterDefinition.Empty); } @@ -89,7 +89,7 @@ namespace OpenIddict.MongoDb } var database = await Context.GetDatabaseAsync(cancellationToken); - var collection = database.GetCollection(Options.CurrentValue.AuthorizationsCollectionName); + var collection = database.GetCollection(Options.Value.AuthorizationsCollectionName); return await ((IMongoQueryable) query(collection.AsQueryable())).LongCountAsync(); } @@ -110,7 +110,7 @@ namespace OpenIddict.MongoDb } var database = await Context.GetDatabaseAsync(cancellationToken); - var collection = database.GetCollection(Options.CurrentValue.AuthorizationsCollectionName); + var collection = database.GetCollection(Options.Value.AuthorizationsCollectionName); await collection.InsertOneAsync(authorization, null, cancellationToken); } @@ -131,7 +131,7 @@ namespace OpenIddict.MongoDb } var database = await Context.GetDatabaseAsync(cancellationToken); - var collection = database.GetCollection(Options.CurrentValue.AuthorizationsCollectionName); + var collection = database.GetCollection(Options.Value.AuthorizationsCollectionName); if ((await collection.DeleteOneAsync(entity => entity.Id == authorization.Id && @@ -144,7 +144,7 @@ namespace OpenIddict.MongoDb } // Delete the tokens associated with the authorization. - await database.GetCollection(Options.CurrentValue.TokensCollectionName) + await database.GetCollection(Options.Value.TokensCollectionName) .DeleteManyAsync(token => token.AuthorizationId == authorization.Id, cancellationToken); } @@ -173,7 +173,7 @@ namespace OpenIddict.MongoDb } var database = await Context.GetDatabaseAsync(cancellationToken); - var collection = database.GetCollection(Options.CurrentValue.AuthorizationsCollectionName); + var collection = database.GetCollection(Options.Value.AuthorizationsCollectionName); return ImmutableArray.CreateRange(await collection.Find(authorization => authorization.Subject == subject && @@ -211,7 +211,7 @@ namespace OpenIddict.MongoDb } var database = await Context.GetDatabaseAsync(cancellationToken); - var collection = database.GetCollection(Options.CurrentValue.AuthorizationsCollectionName); + var collection = database.GetCollection(Options.Value.AuthorizationsCollectionName); return ImmutableArray.CreateRange(await collection.Find(authorization => authorization.Subject == subject && @@ -256,7 +256,7 @@ namespace OpenIddict.MongoDb } var database = await Context.GetDatabaseAsync(cancellationToken); - var collection = database.GetCollection(Options.CurrentValue.AuthorizationsCollectionName); + var collection = database.GetCollection(Options.Value.AuthorizationsCollectionName); return ImmutableArray.CreateRange(await collection.Find(authorization => authorization.Subject == subject && @@ -282,7 +282,7 @@ namespace OpenIddict.MongoDb } var database = await Context.GetDatabaseAsync(cancellationToken); - var collection = database.GetCollection(Options.CurrentValue.AuthorizationsCollectionName); + var collection = database.GetCollection(Options.Value.AuthorizationsCollectionName); return await collection.Find(authorization => authorization.Id == ObjectId.Parse(identifier)).FirstOrDefaultAsync(cancellationToken); } @@ -305,7 +305,7 @@ namespace OpenIddict.MongoDb } var database = await Context.GetDatabaseAsync(cancellationToken); - var collection = database.GetCollection(Options.CurrentValue.AuthorizationsCollectionName); + var collection = database.GetCollection(Options.Value.AuthorizationsCollectionName); return ImmutableArray.CreateRange(await collection.Find(authorization => authorization.Subject == subject).ToListAsync(cancellationToken)); } @@ -351,7 +351,7 @@ namespace OpenIddict.MongoDb } var database = await Context.GetDatabaseAsync(cancellationToken); - var collection = database.GetCollection(Options.CurrentValue.AuthorizationsCollectionName); + var collection = database.GetCollection(Options.Value.AuthorizationsCollectionName); return await ((IMongoQueryable) query(collection.AsQueryable(), state)).FirstOrDefaultAsync(cancellationToken); } @@ -505,7 +505,7 @@ namespace OpenIddict.MongoDb [CanBeNull] int? count, [CanBeNull] int? offset, CancellationToken cancellationToken) { var database = await Context.GetDatabaseAsync(cancellationToken); - var collection = database.GetCollection(Options.CurrentValue.AuthorizationsCollectionName); + var collection = database.GetCollection(Options.Value.AuthorizationsCollectionName); var query = (IMongoQueryable) collection.AsQueryable().OrderBy(authorization => authorization.Id); @@ -544,7 +544,7 @@ namespace OpenIddict.MongoDb } var database = await Context.GetDatabaseAsync(cancellationToken); - var collection = database.GetCollection(Options.CurrentValue.AuthorizationsCollectionName); + var collection = database.GetCollection(Options.Value.AuthorizationsCollectionName); return ImmutableArray.CreateRange( await ((IMongoQueryable) query(collection.AsQueryable(), state)).ToListAsync(cancellationToken)); @@ -560,11 +560,11 @@ namespace OpenIddict.MongoDb public virtual async Task PruneAsync(CancellationToken cancellationToken) { var database = await Context.GetDatabaseAsync(cancellationToken); - var collection = database.GetCollection(Options.CurrentValue.AuthorizationsCollectionName); + var collection = database.GetCollection(Options.Value.AuthorizationsCollectionName); var identifiers = await (from authorization in collection.AsQueryable() - join token in database.GetCollection(Options.CurrentValue.TokensCollectionName).AsQueryable() + join token in database.GetCollection(Options.Value.TokensCollectionName).AsQueryable() on authorization.Id equals token.AuthorizationId into tokens where authorization.Status != OpenIddictConstants.Statuses.Valid || (authorization.Type == OpenIddictConstants.AuthorizationTypes.AdHoc && @@ -745,14 +745,15 @@ namespace OpenIddict.MongoDb // Generate a new concurrency token and attach it // to the authorization before persisting the changes. + var timestamp = authorization.ConcurrencyToken; authorization.ConcurrencyToken = Guid.NewGuid().ToString(); var database = await Context.GetDatabaseAsync(cancellationToken); - var collection = database.GetCollection(Options.CurrentValue.AuthorizationsCollectionName); + var collection = database.GetCollection(Options.Value.AuthorizationsCollectionName); if ((await collection.ReplaceOneAsync(entity => entity.Id == authorization.Id && - entity.ConcurrencyToken == authorization.ConcurrencyToken, authorization, null, cancellationToken)).MatchedCount == 0) + entity.ConcurrencyToken == timestamp, authorization, null, cancellationToken)).MatchedCount == 0) { throw new OpenIddictException(OpenIddictConstants.Exceptions.ConcurrencyError, new StringBuilder() .AppendLine("The authorization was concurrently updated and cannot be persisted in its current state.") diff --git a/src/OpenIddict.MongoDb/Stores/OpenIddictScopeStore.cs b/src/OpenIddict.MongoDb/Stores/OpenIddictScopeStore.cs index 70ad1fef..8a48889a 100644 --- a/src/OpenIddict.MongoDb/Stores/OpenIddictScopeStore.cs +++ b/src/OpenIddict.MongoDb/Stores/OpenIddictScopeStore.cs @@ -33,7 +33,7 @@ namespace OpenIddict.MongoDb public OpenIddictScopeStore( [NotNull] IMemoryCache cache, [NotNull] IOpenIddictMongoDbContext context, - [NotNull] IOptionsMonitor options) + [NotNull] IOptions options) { Cache = cache; Context = context; @@ -53,7 +53,7 @@ namespace OpenIddict.MongoDb /// /// Gets the options associated with the current store. /// - protected IOptionsMonitor Options { get; } + protected IOptions Options { get; } /// /// Determines the number of scopes that exist in the database. @@ -66,7 +66,7 @@ namespace OpenIddict.MongoDb public virtual async Task CountAsync(CancellationToken cancellationToken) { var database = await Context.GetDatabaseAsync(cancellationToken); - var collection = database.GetCollection(Options.CurrentValue.ScopesCollectionName); + var collection = database.GetCollection(Options.Value.ScopesCollectionName); return await collection.CountAsync(FilterDefinition.Empty); } @@ -89,7 +89,7 @@ namespace OpenIddict.MongoDb } var database = await Context.GetDatabaseAsync(cancellationToken); - var collection = database.GetCollection(Options.CurrentValue.ScopesCollectionName); + var collection = database.GetCollection(Options.Value.ScopesCollectionName); return await ((IMongoQueryable) query(collection.AsQueryable())).LongCountAsync(); } @@ -110,7 +110,7 @@ namespace OpenIddict.MongoDb } var database = await Context.GetDatabaseAsync(cancellationToken); - var collection = database.GetCollection(Options.CurrentValue.ScopesCollectionName); + var collection = database.GetCollection(Options.Value.ScopesCollectionName); await collection.InsertOneAsync(scope, null, cancellationToken); } @@ -131,7 +131,7 @@ namespace OpenIddict.MongoDb } var database = await Context.GetDatabaseAsync(cancellationToken); - var collection = database.GetCollection(Options.CurrentValue.ScopesCollectionName); + var collection = database.GetCollection(Options.Value.ScopesCollectionName); if ((await collection.DeleteOneAsync(entity => entity.Id == scope.Id && @@ -161,7 +161,7 @@ namespace OpenIddict.MongoDb } var database = await Context.GetDatabaseAsync(cancellationToken); - var collection = database.GetCollection(Options.CurrentValue.ScopesCollectionName); + var collection = database.GetCollection(Options.Value.ScopesCollectionName); return await collection.Find(scope => scope.Id == ObjectId.Parse(identifier)).FirstOrDefaultAsync(cancellationToken); } @@ -183,7 +183,7 @@ namespace OpenIddict.MongoDb } var database = await Context.GetDatabaseAsync(cancellationToken); - var collection = database.GetCollection(Options.CurrentValue.ScopesCollectionName); + var collection = database.GetCollection(Options.Value.ScopesCollectionName); return await collection.Find(scope => scope.Name == name).FirstOrDefaultAsync(cancellationToken); } @@ -206,7 +206,7 @@ namespace OpenIddict.MongoDb } var database = await Context.GetDatabaseAsync(cancellationToken); - var collection = database.GetCollection(Options.CurrentValue.ScopesCollectionName); + var collection = database.GetCollection(Options.Value.ScopesCollectionName); return ImmutableArray.CreateRange(await collection.Find(scope => names.Contains(scope.Name)).ToListAsync(cancellationToken)); } @@ -229,7 +229,7 @@ namespace OpenIddict.MongoDb } var database = await Context.GetDatabaseAsync(cancellationToken); - var collection = database.GetCollection(Options.CurrentValue.ScopesCollectionName); + var collection = database.GetCollection(Options.Value.ScopesCollectionName); return ImmutableArray.CreateRange(await collection.Find(scope => scope.Resources.Contains(resource)).ToListAsync(cancellationToken)); } @@ -256,7 +256,7 @@ namespace OpenIddict.MongoDb } var database = await Context.GetDatabaseAsync(cancellationToken); - var collection = database.GetCollection(Options.CurrentValue.ScopesCollectionName); + var collection = database.GetCollection(Options.Value.ScopesCollectionName); return await ((IMongoQueryable) query(collection.AsQueryable(), state)).FirstOrDefaultAsync(cancellationToken); } @@ -410,7 +410,7 @@ namespace OpenIddict.MongoDb [CanBeNull] int? count, [CanBeNull] int? offset, CancellationToken cancellationToken) { var database = await Context.GetDatabaseAsync(cancellationToken); - var collection = database.GetCollection(Options.CurrentValue.ScopesCollectionName); + var collection = database.GetCollection(Options.Value.ScopesCollectionName); var query = (IMongoQueryable) collection.AsQueryable().OrderBy(scope => scope.Id); @@ -449,7 +449,7 @@ namespace OpenIddict.MongoDb } var database = await Context.GetDatabaseAsync(cancellationToken); - var collection = database.GetCollection(Options.CurrentValue.ScopesCollectionName); + var collection = database.GetCollection(Options.Value.ScopesCollectionName); return ImmutableArray.CreateRange( await ((IMongoQueryable) query(collection.AsQueryable(), state)).ToListAsync(cancellationToken)); @@ -591,14 +591,15 @@ namespace OpenIddict.MongoDb // Generate a new concurrency token and attach it // to the scope before persisting the changes. + var timestamp = scope.ConcurrencyToken; scope.ConcurrencyToken = Guid.NewGuid().ToString(); var database = await Context.GetDatabaseAsync(cancellationToken); - var collection = database.GetCollection(Options.CurrentValue.ScopesCollectionName); + var collection = database.GetCollection(Options.Value.ScopesCollectionName); if ((await collection.ReplaceOneAsync(entity => entity.Id == scope.Id && - entity.ConcurrencyToken == scope.ConcurrencyToken, scope, null, cancellationToken)).MatchedCount == 0) + entity.ConcurrencyToken == timestamp, scope, null, cancellationToken)).MatchedCount == 0) { throw new OpenIddictException(OpenIddictConstants.Exceptions.ConcurrencyError, new StringBuilder() .AppendLine("The scope was concurrently updated and cannot be persisted in its current state.") diff --git a/src/OpenIddict.MongoDb/Stores/OpenIddictTokenStore.cs b/src/OpenIddict.MongoDb/Stores/OpenIddictTokenStore.cs index 99d7b473..9d0169a5 100644 --- a/src/OpenIddict.MongoDb/Stores/OpenIddictTokenStore.cs +++ b/src/OpenIddict.MongoDb/Stores/OpenIddictTokenStore.cs @@ -33,7 +33,7 @@ namespace OpenIddict.MongoDb public OpenIddictTokenStore( [NotNull] IMemoryCache cache, [NotNull] IOpenIddictMongoDbContext context, - [NotNull] IOptionsMonitor options) + [NotNull] IOptions options) { Cache = cache; Context = context; @@ -53,7 +53,7 @@ namespace OpenIddict.MongoDb /// /// Gets the options associated with the current store. /// - protected IOptionsMonitor Options { get; } + protected IOptions Options { get; } /// /// Determines the number of tokens that exist in the database. @@ -66,7 +66,7 @@ namespace OpenIddict.MongoDb public virtual async Task CountAsync(CancellationToken cancellationToken) { var database = await Context.GetDatabaseAsync(cancellationToken); - var collection = database.GetCollection(Options.CurrentValue.TokensCollectionName); + var collection = database.GetCollection(Options.Value.TokensCollectionName); return await collection.CountAsync(FilterDefinition.Empty); } @@ -89,7 +89,7 @@ namespace OpenIddict.MongoDb } var database = await Context.GetDatabaseAsync(cancellationToken); - var collection = database.GetCollection(Options.CurrentValue.TokensCollectionName); + var collection = database.GetCollection(Options.Value.TokensCollectionName); return await ((IMongoQueryable) query(collection.AsQueryable())).LongCountAsync(); } @@ -110,7 +110,7 @@ namespace OpenIddict.MongoDb } var database = await Context.GetDatabaseAsync(cancellationToken); - var collection = database.GetCollection(Options.CurrentValue.TokensCollectionName); + var collection = database.GetCollection(Options.Value.TokensCollectionName); await collection.InsertOneAsync(token, null, cancellationToken); } @@ -131,7 +131,7 @@ namespace OpenIddict.MongoDb } var database = await Context.GetDatabaseAsync(cancellationToken); - var collection = database.GetCollection(Options.CurrentValue.TokensCollectionName); + var collection = database.GetCollection(Options.Value.TokensCollectionName); if ((await collection.DeleteOneAsync(entity => entity.Id == token.Id && @@ -161,7 +161,7 @@ namespace OpenIddict.MongoDb } var database = await Context.GetDatabaseAsync(cancellationToken); - var collection = database.GetCollection(Options.CurrentValue.TokensCollectionName); + var collection = database.GetCollection(Options.Value.TokensCollectionName); return ImmutableArray.CreateRange(await collection.Find(token => token.ApplicationId == ObjectId.Parse(identifier)).ToListAsync(cancellationToken)); } @@ -183,7 +183,7 @@ namespace OpenIddict.MongoDb } var database = await Context.GetDatabaseAsync(cancellationToken); - var collection = database.GetCollection(Options.CurrentValue.TokensCollectionName); + var collection = database.GetCollection(Options.Value.TokensCollectionName); return ImmutableArray.CreateRange(await collection.Find(token => token.AuthorizationId == ObjectId.Parse(identifier)).ToListAsync(cancellationToken)); } @@ -205,7 +205,7 @@ namespace OpenIddict.MongoDb } var database = await Context.GetDatabaseAsync(cancellationToken); - var collection = database.GetCollection(Options.CurrentValue.TokensCollectionName); + var collection = database.GetCollection(Options.Value.TokensCollectionName); return await collection.Find(token => token.Id == ObjectId.Parse(identifier)).FirstOrDefaultAsync(cancellationToken); } @@ -228,7 +228,7 @@ namespace OpenIddict.MongoDb } var database = await Context.GetDatabaseAsync(cancellationToken); - var collection = database.GetCollection(Options.CurrentValue.TokensCollectionName); + var collection = database.GetCollection(Options.Value.TokensCollectionName); return await collection.Find(token => token.ReferenceId == identifier).FirstOrDefaultAsync(cancellationToken); } @@ -250,7 +250,7 @@ namespace OpenIddict.MongoDb } var database = await Context.GetDatabaseAsync(cancellationToken); - var collection = database.GetCollection(Options.CurrentValue.TokensCollectionName); + var collection = database.GetCollection(Options.Value.TokensCollectionName); return ImmutableArray.CreateRange(await collection.Find(token => token.Subject == subject).ToListAsync(cancellationToken)); } @@ -296,7 +296,7 @@ namespace OpenIddict.MongoDb } var database = await Context.GetDatabaseAsync(cancellationToken); - var collection = database.GetCollection(Options.CurrentValue.TokensCollectionName); + var collection = database.GetCollection(Options.Value.TokensCollectionName); return await ((IMongoQueryable) query(collection.AsQueryable(), state)).FirstOrDefaultAsync(cancellationToken); } @@ -523,7 +523,7 @@ namespace OpenIddict.MongoDb [CanBeNull] int? count, [CanBeNull] int? offset, CancellationToken cancellationToken) { var database = await Context.GetDatabaseAsync(cancellationToken); - var collection = database.GetCollection(Options.CurrentValue.TokensCollectionName); + var collection = database.GetCollection(Options.Value.TokensCollectionName); var query = (IMongoQueryable) collection.AsQueryable().OrderBy(token => token.Id); @@ -562,7 +562,7 @@ namespace OpenIddict.MongoDb } var database = await Context.GetDatabaseAsync(cancellationToken); - var collection = database.GetCollection(Options.CurrentValue.TokensCollectionName); + var collection = database.GetCollection(Options.Value.TokensCollectionName); return ImmutableArray.CreateRange( await ((IMongoQueryable) query(collection.AsQueryable(), state)).ToListAsync(cancellationToken)); @@ -578,7 +578,7 @@ namespace OpenIddict.MongoDb public virtual async Task PruneAsync(CancellationToken cancellationToken) { var database = await Context.GetDatabaseAsync(cancellationToken); - var collection = database.GetCollection(Options.CurrentValue.TokensCollectionName); + var collection = database.GetCollection(Options.Value.TokensCollectionName); await collection.DeleteManyAsync(token => token.ExpirationDate < DateTimeOffset.UtcNow || token.Status != OpenIddictConstants.Statuses.Valid, cancellationToken); @@ -855,14 +855,15 @@ namespace OpenIddict.MongoDb // Generate a new concurrency token and attach it // to the token before persisting the changes. + var timestamp = token.ConcurrencyToken; token.ConcurrencyToken = Guid.NewGuid().ToString(); var database = await Context.GetDatabaseAsync(cancellationToken); - var collection = database.GetCollection(Options.CurrentValue.TokensCollectionName); + var collection = database.GetCollection(Options.Value.TokensCollectionName); if ((await collection.ReplaceOneAsync(entity => entity.Id == token.Id && - entity.ConcurrencyToken == token.ConcurrencyToken, token, null, cancellationToken)).MatchedCount == 0) + entity.ConcurrencyToken == timestamp, token, null, cancellationToken)).MatchedCount == 0) { throw new OpenIddictException(OpenIddictConstants.Exceptions.ConcurrencyError, new StringBuilder() .AppendLine("The token was concurrently updated and cannot be persisted in its current state.")