|
|
|
@ -13,7 +13,6 @@ using System.Text.Encodings.Web; |
|
|
|
using System.Text.Json; |
|
|
|
using System.Threading; |
|
|
|
using System.Threading.Tasks; |
|
|
|
using JetBrains.Annotations; |
|
|
|
using Microsoft.Extensions.Options; |
|
|
|
using MongoDB.Bson; |
|
|
|
using MongoDB.Driver; |
|
|
|
@ -32,8 +31,8 @@ namespace OpenIddict.MongoDb |
|
|
|
where TToken : OpenIddictMongoDbToken |
|
|
|
{ |
|
|
|
public OpenIddictMongoDbTokenStore( |
|
|
|
[NotNull] IOpenIddictMongoDbContext context, |
|
|
|
[NotNull] IOptionsMonitor<OpenIddictMongoDbOptions> options) |
|
|
|
IOpenIddictMongoDbContext context, |
|
|
|
IOptionsMonitor<OpenIddictMongoDbOptions> options) |
|
|
|
{ |
|
|
|
Context = context; |
|
|
|
Options = options; |
|
|
|
@ -49,14 +48,7 @@ namespace OpenIddict.MongoDb |
|
|
|
/// </summary>
|
|
|
|
protected IOptionsMonitor<OpenIddictMongoDbOptions> Options { get; } |
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
/// Determines the number of tokens that exist in the database.
|
|
|
|
/// </summary>
|
|
|
|
/// <param name="cancellationToken">The <see cref="CancellationToken"/> that can be used to abort the operation.</param>
|
|
|
|
/// <returns>
|
|
|
|
/// A <see cref="ValueTask"/> that can be used to monitor the asynchronous operation,
|
|
|
|
/// whose result returns the number of applications in the database.
|
|
|
|
/// </returns>
|
|
|
|
/// <inheritdoc/>
|
|
|
|
public virtual async ValueTask<long> CountAsync(CancellationToken cancellationToken) |
|
|
|
{ |
|
|
|
var database = await Context.GetDatabaseAsync(cancellationToken); |
|
|
|
@ -65,18 +57,9 @@ namespace OpenIddict.MongoDb |
|
|
|
return await collection.CountDocumentsAsync(FilterDefinition<TToken>.Empty, null, cancellationToken); |
|
|
|
} |
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
/// Determines the number of tokens that match the specified query.
|
|
|
|
/// </summary>
|
|
|
|
/// <typeparam name="TResult">The result type.</typeparam>
|
|
|
|
/// <param name="query">The query to execute.</param>
|
|
|
|
/// <param name="cancellationToken">The <see cref="CancellationToken"/> that can be used to abort the operation.</param>
|
|
|
|
/// <returns>
|
|
|
|
/// A <see cref="ValueTask"/> that can be used to monitor the asynchronous operation,
|
|
|
|
/// whose result returns the number of tokens that match the specified query.
|
|
|
|
/// </returns>
|
|
|
|
/// <inheritdoc/>
|
|
|
|
public virtual async ValueTask<long> CountAsync<TResult>( |
|
|
|
[NotNull] Func<IQueryable<TToken>, IQueryable<TResult>> query, CancellationToken cancellationToken) |
|
|
|
Func<IQueryable<TToken>, IQueryable<TResult>> query, CancellationToken cancellationToken) |
|
|
|
{ |
|
|
|
if (query == null) |
|
|
|
{ |
|
|
|
@ -89,13 +72,8 @@ namespace OpenIddict.MongoDb |
|
|
|
return await ((IMongoQueryable<TToken>) query(collection.AsQueryable())).LongCountAsync(cancellationToken); |
|
|
|
} |
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
/// Creates a new token.
|
|
|
|
/// </summary>
|
|
|
|
/// <param name="token">The token to create.</param>
|
|
|
|
/// <param name="cancellationToken">The <see cref="CancellationToken"/> that can be used to abort the operation.</param>
|
|
|
|
/// <returns>A <see cref="ValueTask"/> that can be used to monitor the asynchronous operation.</returns>
|
|
|
|
public virtual async ValueTask CreateAsync([NotNull] TToken token, CancellationToken cancellationToken) |
|
|
|
/// <inheritdoc/>
|
|
|
|
public virtual async ValueTask CreateAsync(TToken token, CancellationToken cancellationToken) |
|
|
|
{ |
|
|
|
if (token == null) |
|
|
|
{ |
|
|
|
@ -108,13 +86,8 @@ namespace OpenIddict.MongoDb |
|
|
|
await collection.InsertOneAsync(token, null, cancellationToken); |
|
|
|
} |
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
/// Removes a token.
|
|
|
|
/// </summary>
|
|
|
|
/// <param name="token">The token to delete.</param>
|
|
|
|
/// <param name="cancellationToken">The <see cref="CancellationToken"/> that can be used to abort the operation.</param>
|
|
|
|
/// <returns>A <see cref="ValueTask"/> that can be used to monitor the asynchronous operation.</returns>
|
|
|
|
public virtual async ValueTask DeleteAsync([NotNull] TToken token, CancellationToken cancellationToken) |
|
|
|
/// <inheritdoc/>
|
|
|
|
public virtual async ValueTask DeleteAsync(TToken token, CancellationToken cancellationToken) |
|
|
|
{ |
|
|
|
if (token == null) |
|
|
|
{ |
|
|
|
@ -132,16 +105,9 @@ namespace OpenIddict.MongoDb |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
/// Retrieves the tokens corresponding to the specified
|
|
|
|
/// subject and associated with the application identifier.
|
|
|
|
/// </summary>
|
|
|
|
/// <param name="subject">The subject associated with the token.</param>
|
|
|
|
/// <param name="client">The client associated with the token.</param>
|
|
|
|
/// <param name="cancellationToken">The <see cref="CancellationToken"/> that can be used to abort the operation.</param>
|
|
|
|
/// <returns>The tokens corresponding to the subject/client.</returns>
|
|
|
|
public virtual IAsyncEnumerable<TToken> FindAsync([NotNull] string subject, |
|
|
|
[NotNull] string client, CancellationToken cancellationToken) |
|
|
|
/// <inheritdoc/>
|
|
|
|
public virtual IAsyncEnumerable<TToken> FindAsync(string subject, |
|
|
|
string client, CancellationToken cancellationToken) |
|
|
|
{ |
|
|
|
if (string.IsNullOrEmpty(subject)) |
|
|
|
{ |
|
|
|
@ -169,17 +135,10 @@ namespace OpenIddict.MongoDb |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
/// Retrieves the tokens matching the specified parameters.
|
|
|
|
/// </summary>
|
|
|
|
/// <param name="subject">The subject associated with the token.</param>
|
|
|
|
/// <param name="client">The client associated with the token.</param>
|
|
|
|
/// <param name="status">The token status.</param>
|
|
|
|
/// <param name="cancellationToken">The <see cref="CancellationToken"/> that can be used to abort the operation.</param>
|
|
|
|
/// <returns>The tokens corresponding to the criteria.</returns>
|
|
|
|
/// <inheritdoc/>
|
|
|
|
public virtual IAsyncEnumerable<TToken> FindAsync( |
|
|
|
[NotNull] string subject, [NotNull] string client, |
|
|
|
[NotNull] string status, CancellationToken cancellationToken) |
|
|
|
string subject, string client, |
|
|
|
string status, CancellationToken cancellationToken) |
|
|
|
{ |
|
|
|
if (string.IsNullOrEmpty(subject)) |
|
|
|
{ |
|
|
|
@ -213,18 +172,10 @@ namespace OpenIddict.MongoDb |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
/// Retrieves the tokens matching the specified parameters.
|
|
|
|
/// </summary>
|
|
|
|
/// <param name="subject">The subject associated with the token.</param>
|
|
|
|
/// <param name="client">The client associated with the token.</param>
|
|
|
|
/// <param name="status">The token status.</param>
|
|
|
|
/// <param name="type">The token type.</param>
|
|
|
|
/// <param name="cancellationToken">The <see cref="CancellationToken"/> that can be used to abort the operation.</param>
|
|
|
|
/// <returns>The tokens corresponding to the criteria.</returns>
|
|
|
|
/// <inheritdoc/>
|
|
|
|
public virtual IAsyncEnumerable<TToken> FindAsync( |
|
|
|
[NotNull] string subject, [NotNull] string client, |
|
|
|
[NotNull] string status, [NotNull] string type, CancellationToken cancellationToken) |
|
|
|
string subject, string client, |
|
|
|
string status, string type, CancellationToken cancellationToken) |
|
|
|
{ |
|
|
|
if (string.IsNullOrEmpty(subject)) |
|
|
|
{ |
|
|
|
@ -264,14 +215,8 @@ namespace OpenIddict.MongoDb |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
/// Retrieves the list of tokens corresponding to the specified application identifier.
|
|
|
|
/// </summary>
|
|
|
|
/// <param name="identifier">The application identifier associated with the tokens.</param>
|
|
|
|
/// <param name="cancellationToken">The <see cref="CancellationToken"/> that can be used to abort the operation.</param>
|
|
|
|
/// <returns>The tokens corresponding to the specified application.</returns>
|
|
|
|
public virtual IAsyncEnumerable<TToken> FindByApplicationIdAsync( |
|
|
|
[NotNull] string identifier, CancellationToken cancellationToken) |
|
|
|
/// <inheritdoc/>
|
|
|
|
public virtual IAsyncEnumerable<TToken> FindByApplicationIdAsync(string identifier, CancellationToken cancellationToken) |
|
|
|
{ |
|
|
|
if (string.IsNullOrEmpty(identifier)) |
|
|
|
{ |
|
|
|
@ -293,14 +238,8 @@ namespace OpenIddict.MongoDb |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
/// Retrieves the list of tokens corresponding to the specified authorization identifier.
|
|
|
|
/// </summary>
|
|
|
|
/// <param name="identifier">The authorization identifier associated with the tokens.</param>
|
|
|
|
/// <param name="cancellationToken">The <see cref="CancellationToken"/> that can be used to abort the operation.</param>
|
|
|
|
/// <returns>The tokens corresponding to the specified authorization.</returns>
|
|
|
|
public virtual IAsyncEnumerable<TToken> FindByAuthorizationIdAsync( |
|
|
|
[NotNull] string identifier, CancellationToken cancellationToken) |
|
|
|
/// <inheritdoc/>
|
|
|
|
public virtual IAsyncEnumerable<TToken> FindByAuthorizationIdAsync(string identifier, CancellationToken cancellationToken) |
|
|
|
{ |
|
|
|
if (string.IsNullOrEmpty(identifier)) |
|
|
|
{ |
|
|
|
@ -322,16 +261,8 @@ namespace OpenIddict.MongoDb |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
/// Retrieves a token using its unique identifier.
|
|
|
|
/// </summary>
|
|
|
|
/// <param name="identifier">The unique identifier associated with the token.</param>
|
|
|
|
/// <param name="cancellationToken">The <see cref="CancellationToken"/> that can be used to abort the operation.</param>
|
|
|
|
/// <returns>
|
|
|
|
/// A <see cref="ValueTask"/> that can be used to monitor the asynchronous operation,
|
|
|
|
/// whose result returns the token corresponding to the unique identifier.
|
|
|
|
/// </returns>
|
|
|
|
public virtual async ValueTask<TToken> FindByIdAsync([NotNull] string identifier, CancellationToken cancellationToken) |
|
|
|
/// <inheritdoc/>
|
|
|
|
public virtual async ValueTask<TToken?> FindByIdAsync(string identifier, CancellationToken cancellationToken) |
|
|
|
{ |
|
|
|
if (string.IsNullOrEmpty(identifier)) |
|
|
|
{ |
|
|
|
@ -344,17 +275,8 @@ namespace OpenIddict.MongoDb |
|
|
|
return await collection.Find(token => token.Id == ObjectId.Parse(identifier)).FirstOrDefaultAsync(cancellationToken); |
|
|
|
} |
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
/// Retrieves the list of tokens corresponding to the specified reference identifier.
|
|
|
|
/// Note: the reference identifier may be hashed or encrypted for security reasons.
|
|
|
|
/// </summary>
|
|
|
|
/// <param name="identifier">The reference identifier associated with the tokens.</param>
|
|
|
|
/// <param name="cancellationToken">The <see cref="CancellationToken"/> that can be used to abort the operation.</param>
|
|
|
|
/// <returns>
|
|
|
|
/// A <see cref="ValueTask"/> that can be used to monitor the asynchronous operation,
|
|
|
|
/// whose result returns the tokens corresponding to the specified reference identifier.
|
|
|
|
/// </returns>
|
|
|
|
public virtual async ValueTask<TToken> FindByReferenceIdAsync([NotNull] string identifier, CancellationToken cancellationToken) |
|
|
|
/// <inheritdoc/>
|
|
|
|
public virtual async ValueTask<TToken?> FindByReferenceIdAsync(string identifier, CancellationToken cancellationToken) |
|
|
|
{ |
|
|
|
if (string.IsNullOrEmpty(identifier)) |
|
|
|
{ |
|
|
|
@ -367,13 +289,8 @@ namespace OpenIddict.MongoDb |
|
|
|
return await collection.Find(token => token.ReferenceId == identifier).FirstOrDefaultAsync(cancellationToken); |
|
|
|
} |
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
/// Retrieves the list of tokens corresponding to the specified subject.
|
|
|
|
/// </summary>
|
|
|
|
/// <param name="subject">The subject associated with the tokens.</param>
|
|
|
|
/// <param name="cancellationToken">The <see cref="CancellationToken"/> that can be used to abort the operation.</param>
|
|
|
|
/// <returns>The tokens corresponding to the specified subject.</returns>
|
|
|
|
public virtual IAsyncEnumerable<TToken> FindBySubjectAsync([NotNull] string subject, CancellationToken cancellationToken) |
|
|
|
/// <inheritdoc/>
|
|
|
|
public virtual IAsyncEnumerable<TToken> FindBySubjectAsync(string subject, CancellationToken cancellationToken) |
|
|
|
{ |
|
|
|
if (string.IsNullOrEmpty(subject)) |
|
|
|
{ |
|
|
|
@ -394,40 +311,26 @@ namespace OpenIddict.MongoDb |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
/// Retrieves the optional application identifier associated with a token.
|
|
|
|
/// </summary>
|
|
|
|
/// <param name="token">The token.</param>
|
|
|
|
/// <param name="cancellationToken">The <see cref="CancellationToken"/> that can be used to abort the operation.</param>
|
|
|
|
/// <returns>
|
|
|
|
/// A <see cref="ValueTask{TResult}"/> that can be used to monitor the asynchronous operation,
|
|
|
|
/// whose result returns the application identifier associated with the token.
|
|
|
|
/// </returns>
|
|
|
|
public virtual ValueTask<string> GetApplicationIdAsync([NotNull] TToken token, CancellationToken cancellationToken) |
|
|
|
/// <inheritdoc/>
|
|
|
|
public virtual ValueTask<string?> GetApplicationIdAsync(TToken token, CancellationToken cancellationToken) |
|
|
|
{ |
|
|
|
if (token == null) |
|
|
|
{ |
|
|
|
throw new ArgumentNullException(nameof(token)); |
|
|
|
} |
|
|
|
|
|
|
|
return new ValueTask<string>(token.ApplicationId.ToString()); |
|
|
|
if (token.ApplicationId == ObjectId.Empty) |
|
|
|
{ |
|
|
|
return new ValueTask<string?>(result: null); |
|
|
|
} |
|
|
|
|
|
|
|
return new ValueTask<string?>(token.ApplicationId.ToString()); |
|
|
|
} |
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
/// Executes the specified query and returns the first element.
|
|
|
|
/// </summary>
|
|
|
|
/// <typeparam name="TState">The state type.</typeparam>
|
|
|
|
/// <typeparam name="TResult">The result type.</typeparam>
|
|
|
|
/// <param name="query">The query to execute.</param>
|
|
|
|
/// <param name="state">The optional state.</param>
|
|
|
|
/// <param name="cancellationToken">The <see cref="CancellationToken"/> that can be used to abort the operation.</param>
|
|
|
|
/// <returns>
|
|
|
|
/// A <see cref="ValueTask"/> that can be used to monitor the asynchronous operation,
|
|
|
|
/// whose result returns the first element returned when executing the query.
|
|
|
|
/// </returns>
|
|
|
|
/// <inheritdoc/>
|
|
|
|
public virtual async ValueTask<TResult> GetAsync<TState, TResult>( |
|
|
|
[NotNull] Func<IQueryable<TToken>, TState, IQueryable<TResult>> query, |
|
|
|
[CanBeNull] TState state, CancellationToken cancellationToken) |
|
|
|
Func<IQueryable<TToken>, TState, IQueryable<TResult>> query, |
|
|
|
TState state, CancellationToken cancellationToken) |
|
|
|
{ |
|
|
|
if (query == null) |
|
|
|
{ |
|
|
|
@ -440,35 +343,24 @@ namespace OpenIddict.MongoDb |
|
|
|
return await ((IMongoQueryable<TResult>) query(collection.AsQueryable(), state)).FirstOrDefaultAsync(cancellationToken); |
|
|
|
} |
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
/// Retrieves the optional authorization identifier associated with a token.
|
|
|
|
/// </summary>
|
|
|
|
/// <param name="token">The token.</param>
|
|
|
|
/// <param name="cancellationToken">The <see cref="CancellationToken"/> that can be used to abort the operation.</param>
|
|
|
|
/// <returns>
|
|
|
|
/// A <see cref="ValueTask{TResult}"/> that can be used to monitor the asynchronous operation,
|
|
|
|
/// whose result returns the authorization identifier associated with the token.
|
|
|
|
/// </returns>
|
|
|
|
public virtual ValueTask<string> GetAuthorizationIdAsync([NotNull] TToken token, CancellationToken cancellationToken) |
|
|
|
/// <inheritdoc/>
|
|
|
|
public virtual ValueTask<string?> GetAuthorizationIdAsync(TToken token, CancellationToken cancellationToken) |
|
|
|
{ |
|
|
|
if (token == null) |
|
|
|
{ |
|
|
|
throw new ArgumentNullException(nameof(token)); |
|
|
|
} |
|
|
|
|
|
|
|
return new ValueTask<string>(token.AuthorizationId.ToString()); |
|
|
|
if (token.AuthorizationId == ObjectId.Empty) |
|
|
|
{ |
|
|
|
return new ValueTask<string?>(result: null); |
|
|
|
} |
|
|
|
|
|
|
|
return new ValueTask<string?>(token.AuthorizationId.ToString()); |
|
|
|
} |
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
/// Retrieves the creation date associated with a token.
|
|
|
|
/// </summary>
|
|
|
|
/// <param name="token">The token.</param>
|
|
|
|
/// <param name="cancellationToken">The <see cref="CancellationToken"/> that can be used to abort the operation.</param>
|
|
|
|
/// <returns>
|
|
|
|
/// A <see cref="ValueTask{TResult}"/> that can be used to monitor the asynchronous operation,
|
|
|
|
/// whose result returns the creation date associated with the specified token.
|
|
|
|
/// </returns>
|
|
|
|
public virtual ValueTask<DateTimeOffset?> GetCreationDateAsync([NotNull] TToken token, CancellationToken cancellationToken) |
|
|
|
/// <inheritdoc/>
|
|
|
|
public virtual ValueTask<DateTimeOffset?> GetCreationDateAsync(TToken token, CancellationToken cancellationToken) |
|
|
|
{ |
|
|
|
if (token == null) |
|
|
|
{ |
|
|
|
@ -478,16 +370,8 @@ namespace OpenIddict.MongoDb |
|
|
|
return new ValueTask<DateTimeOffset?>(token.CreationDate); |
|
|
|
} |
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
/// Retrieves the expiration date associated with a token.
|
|
|
|
/// </summary>
|
|
|
|
/// <param name="token">The token.</param>
|
|
|
|
/// <param name="cancellationToken">The <see cref="CancellationToken"/> that can be used to abort the operation.</param>
|
|
|
|
/// <returns>
|
|
|
|
/// A <see cref="ValueTask{TResult}"/> that can be used to monitor the asynchronous operation,
|
|
|
|
/// whose result returns the expiration date associated with the specified token.
|
|
|
|
/// </returns>
|
|
|
|
public virtual ValueTask<DateTimeOffset?> GetExpirationDateAsync([NotNull] TToken token, CancellationToken cancellationToken) |
|
|
|
/// <inheritdoc/>
|
|
|
|
public virtual ValueTask<DateTimeOffset?> GetExpirationDateAsync(TToken token, CancellationToken cancellationToken) |
|
|
|
{ |
|
|
|
if (token == null) |
|
|
|
{ |
|
|
|
@ -497,54 +381,30 @@ namespace OpenIddict.MongoDb |
|
|
|
return new ValueTask<DateTimeOffset?>(token.ExpirationDate); |
|
|
|
} |
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
/// Retrieves the unique identifier associated with a token.
|
|
|
|
/// </summary>
|
|
|
|
/// <param name="token">The token.</param>
|
|
|
|
/// <param name="cancellationToken">The <see cref="CancellationToken"/> that can be used to abort the operation.</param>
|
|
|
|
/// <returns>
|
|
|
|
/// A <see cref="ValueTask{TResult}"/> that can be used to monitor the asynchronous operation,
|
|
|
|
/// whose result returns the unique identifier associated with the token.
|
|
|
|
/// </returns>
|
|
|
|
public virtual ValueTask<string> GetIdAsync([NotNull] TToken token, CancellationToken cancellationToken) |
|
|
|
/// <inheritdoc/>
|
|
|
|
public virtual ValueTask<string?> GetIdAsync(TToken token, CancellationToken cancellationToken) |
|
|
|
{ |
|
|
|
if (token == null) |
|
|
|
{ |
|
|
|
throw new ArgumentNullException(nameof(token)); |
|
|
|
} |
|
|
|
|
|
|
|
return new ValueTask<string>(token.Id.ToString()); |
|
|
|
return new ValueTask<string?>(token.Id.ToString()); |
|
|
|
} |
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
/// Retrieves the payload associated with a token.
|
|
|
|
/// </summary>
|
|
|
|
/// <param name="token">The token.</param>
|
|
|
|
/// <param name="cancellationToken">The <see cref="CancellationToken"/> that can be used to abort the operation.</param>
|
|
|
|
/// <returns>
|
|
|
|
/// A <see cref="ValueTask{TResult}"/> that can be used to monitor the asynchronous operation,
|
|
|
|
/// whose result returns the payload associated with the specified token.
|
|
|
|
/// </returns>
|
|
|
|
public virtual ValueTask<string> GetPayloadAsync([NotNull] TToken token, CancellationToken cancellationToken) |
|
|
|
/// <inheritdoc/>
|
|
|
|
public virtual ValueTask<string?> GetPayloadAsync(TToken token, CancellationToken cancellationToken) |
|
|
|
{ |
|
|
|
if (token == null) |
|
|
|
{ |
|
|
|
throw new ArgumentNullException(nameof(token)); |
|
|
|
} |
|
|
|
|
|
|
|
return new ValueTask<string>(token.Payload); |
|
|
|
return new ValueTask<string?>(token.Payload); |
|
|
|
} |
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
/// Retrieves the additional properties associated with a token.
|
|
|
|
/// </summary>
|
|
|
|
/// <param name="token">The token.</param>
|
|
|
|
/// <param name="cancellationToken">The <see cref="CancellationToken"/> that can be used to abort the operation.</param>
|
|
|
|
/// <returns>
|
|
|
|
/// A <see cref="ValueTask{TResult}"/> that can be used to monitor the asynchronous operation,
|
|
|
|
/// whose result returns all the additional properties associated with the token.
|
|
|
|
/// </returns>
|
|
|
|
public virtual ValueTask<ImmutableDictionary<string, JsonElement>> GetPropertiesAsync([NotNull] TToken token, CancellationToken cancellationToken) |
|
|
|
/// <inheritdoc/>
|
|
|
|
public virtual ValueTask<ImmutableDictionary<string, JsonElement>> GetPropertiesAsync(TToken token, CancellationToken cancellationToken) |
|
|
|
{ |
|
|
|
if (token == null) |
|
|
|
{ |
|
|
|
@ -560,92 +420,51 @@ namespace OpenIddict.MongoDb |
|
|
|
JsonSerializer.Deserialize<ImmutableDictionary<string, JsonElement>>(token.Properties.ToJson())); |
|
|
|
} |
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
/// Retrieves the reference identifier associated with a token.
|
|
|
|
/// Note: depending on the manager used to create the token,
|
|
|
|
/// the reference identifier may be hashed for security reasons.
|
|
|
|
/// </summary>
|
|
|
|
/// <param name="token">The token.</param>
|
|
|
|
/// <param name="cancellationToken">The <see cref="CancellationToken"/> that can be used to abort the operation.</param>
|
|
|
|
/// <returns>
|
|
|
|
/// A <see cref="ValueTask{TResult}"/> that can be used to monitor the asynchronous operation,
|
|
|
|
/// whose result returns the reference identifier associated with the specified token.
|
|
|
|
/// </returns>
|
|
|
|
public virtual ValueTask<string> GetReferenceIdAsync([NotNull] TToken token, CancellationToken cancellationToken) |
|
|
|
/// <inheritdoc/>
|
|
|
|
public virtual ValueTask<string?> GetReferenceIdAsync(TToken token, CancellationToken cancellationToken) |
|
|
|
{ |
|
|
|
if (token == null) |
|
|
|
{ |
|
|
|
throw new ArgumentNullException(nameof(token)); |
|
|
|
} |
|
|
|
|
|
|
|
return new ValueTask<string>(token.ReferenceId); |
|
|
|
return new ValueTask<string?>(token.ReferenceId); |
|
|
|
} |
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
/// Retrieves the status associated with a token.
|
|
|
|
/// </summary>
|
|
|
|
/// <param name="token">The token.</param>
|
|
|
|
/// <param name="cancellationToken">The <see cref="CancellationToken"/> that can be used to abort the operation.</param>
|
|
|
|
/// <returns>
|
|
|
|
/// A <see cref="ValueTask{TResult}"/> that can be used to monitor the asynchronous operation,
|
|
|
|
/// whose result returns the status associated with the specified token.
|
|
|
|
/// </returns>
|
|
|
|
public virtual ValueTask<string> GetStatusAsync([NotNull] TToken token, CancellationToken cancellationToken) |
|
|
|
/// <inheritdoc/>
|
|
|
|
public virtual ValueTask<string?> GetStatusAsync(TToken token, CancellationToken cancellationToken) |
|
|
|
{ |
|
|
|
if (token == null) |
|
|
|
{ |
|
|
|
throw new ArgumentNullException(nameof(token)); |
|
|
|
} |
|
|
|
|
|
|
|
return new ValueTask<string>(token.Status); |
|
|
|
return new ValueTask<string?>(token.Status); |
|
|
|
} |
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
/// Retrieves the subject associated with a token.
|
|
|
|
/// </summary>
|
|
|
|
/// <param name="token">The token.</param>
|
|
|
|
/// <param name="cancellationToken">The <see cref="CancellationToken"/> that can be used to abort the operation.</param>
|
|
|
|
/// <returns>
|
|
|
|
/// A <see cref="ValueTask{TResult}"/> that can be used to monitor the asynchronous operation,
|
|
|
|
/// whose result returns the subject associated with the specified token.
|
|
|
|
/// </returns>
|
|
|
|
public virtual ValueTask<string> GetSubjectAsync([NotNull] TToken token, CancellationToken cancellationToken) |
|
|
|
/// <inheritdoc/>
|
|
|
|
public virtual ValueTask<string?> GetSubjectAsync(TToken token, CancellationToken cancellationToken) |
|
|
|
{ |
|
|
|
if (token == null) |
|
|
|
{ |
|
|
|
throw new ArgumentNullException(nameof(token)); |
|
|
|
} |
|
|
|
|
|
|
|
return new ValueTask<string>(token.Subject); |
|
|
|
return new ValueTask<string?>(token.Subject); |
|
|
|
} |
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
/// Retrieves the token type associated with a token.
|
|
|
|
/// </summary>
|
|
|
|
/// <param name="token">The token.</param>
|
|
|
|
/// <param name="cancellationToken">The <see cref="CancellationToken"/> that can be used to abort the operation.</param>
|
|
|
|
/// <returns>
|
|
|
|
/// A <see cref="ValueTask{TResult}"/> that can be used to monitor the asynchronous operation,
|
|
|
|
/// whose result returns the token type associated with the specified token.
|
|
|
|
/// </returns>
|
|
|
|
public virtual ValueTask<string> GetTypeAsync([NotNull] TToken token, CancellationToken cancellationToken) |
|
|
|
/// <inheritdoc/>
|
|
|
|
public virtual ValueTask<string?> GetTypeAsync(TToken token, CancellationToken cancellationToken) |
|
|
|
{ |
|
|
|
if (token == null) |
|
|
|
{ |
|
|
|
throw new ArgumentNullException(nameof(token)); |
|
|
|
} |
|
|
|
|
|
|
|
return new ValueTask<string>(token.Type); |
|
|
|
return new ValueTask<string?>(token.Type); |
|
|
|
} |
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
/// Instantiates a new token.
|
|
|
|
/// </summary>
|
|
|
|
/// <param name="cancellationToken">The <see cref="CancellationToken"/> that can be used to abort the operation.</param>
|
|
|
|
/// <returns>
|
|
|
|
/// A <see cref="ValueTask{TResult}"/> that can be used to monitor the asynchronous operation,
|
|
|
|
/// whose result returns the instantiated token, that can be persisted in the database.
|
|
|
|
/// </returns>
|
|
|
|
/// <inheritdoc/>
|
|
|
|
public virtual ValueTask<TToken> InstantiateAsync(CancellationToken cancellationToken) |
|
|
|
{ |
|
|
|
try |
|
|
|
@ -660,15 +479,9 @@ namespace OpenIddict.MongoDb |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
/// Executes the specified query and returns all the corresponding elements.
|
|
|
|
/// </summary>
|
|
|
|
/// <param name="count">The number of results to return.</param>
|
|
|
|
/// <param name="offset">The number of results to skip.</param>
|
|
|
|
/// <param name="cancellationToken">The <see cref="CancellationToken"/> that can be used to abort the operation.</param>
|
|
|
|
/// <returns>All the elements returned when executing the specified query.</returns>
|
|
|
|
/// <inheritdoc/>
|
|
|
|
public virtual async IAsyncEnumerable<TToken> ListAsync( |
|
|
|
[CanBeNull] int? count, [CanBeNull] int? offset, [EnumeratorCancellation] CancellationToken cancellationToken) |
|
|
|
int? count, int? offset, [EnumeratorCancellation] CancellationToken cancellationToken) |
|
|
|
{ |
|
|
|
var database = await Context.GetDatabaseAsync(cancellationToken); |
|
|
|
var collection = database.GetCollection<TToken>(Options.CurrentValue.TokensCollectionName); |
|
|
|
@ -691,18 +504,10 @@ namespace OpenIddict.MongoDb |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
/// Executes the specified query and returns all the corresponding elements.
|
|
|
|
/// </summary>
|
|
|
|
/// <typeparam name="TState">The state type.</typeparam>
|
|
|
|
/// <typeparam name="TResult">The result type.</typeparam>
|
|
|
|
/// <param name="query">The query to execute.</param>
|
|
|
|
/// <param name="state">The optional state.</param>
|
|
|
|
/// <param name="cancellationToken">The <see cref="CancellationToken"/> that can be used to abort the operation.</param>
|
|
|
|
/// <returns>All the elements returned when executing the specified query.</returns>
|
|
|
|
/// <inheritdoc/>
|
|
|
|
public virtual IAsyncEnumerable<TResult> ListAsync<TState, TResult>( |
|
|
|
[NotNull] Func<IQueryable<TToken>, TState, IQueryable<TResult>> query, |
|
|
|
[CanBeNull] TState state, CancellationToken cancellationToken) |
|
|
|
Func<IQueryable<TToken>, TState, IQueryable<TResult>> query, |
|
|
|
TState state, CancellationToken cancellationToken) |
|
|
|
{ |
|
|
|
if (query == null) |
|
|
|
{ |
|
|
|
@ -723,11 +528,7 @@ namespace OpenIddict.MongoDb |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
/// Removes the tokens that are marked as expired or invalid.
|
|
|
|
/// </summary>
|
|
|
|
/// <param name="cancellationToken">The <see cref="CancellationToken"/> that can be used to abort the operation.</param>
|
|
|
|
/// <returns>A <see cref="ValueTask"/> that can be used to monitor the asynchronous operation.</returns>
|
|
|
|
/// <inheritdoc/>
|
|
|
|
public virtual async ValueTask PruneAsync(CancellationToken cancellationToken) |
|
|
|
{ |
|
|
|
var database = await Context.GetDatabaseAsync(cancellationToken); |
|
|
|
@ -737,15 +538,8 @@ namespace OpenIddict.MongoDb |
|
|
|
token.ExpirationDate < DateTime.UtcNow, cancellationToken); |
|
|
|
} |
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
/// Sets the application identifier associated with a token.
|
|
|
|
/// </summary>
|
|
|
|
/// <param name="token">The token.</param>
|
|
|
|
/// <param name="identifier">The unique identifier associated with the client application.</param>
|
|
|
|
/// <param name="cancellationToken">The <see cref="CancellationToken"/> that can be used to abort the operation.</param>
|
|
|
|
/// <returns>A <see cref="ValueTask"/> that can be used to monitor the asynchronous operation.</returns>
|
|
|
|
public virtual ValueTask SetApplicationIdAsync([NotNull] TToken token, |
|
|
|
[CanBeNull] string identifier, CancellationToken cancellationToken) |
|
|
|
/// <inheritdoc/>
|
|
|
|
public virtual ValueTask SetApplicationIdAsync(TToken token, string? identifier, CancellationToken cancellationToken) |
|
|
|
{ |
|
|
|
if (token == null) |
|
|
|
{ |
|
|
|
@ -765,15 +559,8 @@ namespace OpenIddict.MongoDb |
|
|
|
return default; |
|
|
|
} |
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
/// Sets the authorization identifier associated with a token.
|
|
|
|
/// </summary>
|
|
|
|
/// <param name="token">The token.</param>
|
|
|
|
/// <param name="identifier">The unique identifier associated with the authorization.</param>
|
|
|
|
/// <param name="cancellationToken">The <see cref="CancellationToken"/> that can be used to abort the operation.</param>
|
|
|
|
/// <returns>A <see cref="ValueTask"/> that can be used to monitor the asynchronous operation.</returns>
|
|
|
|
public virtual ValueTask SetAuthorizationIdAsync([NotNull] TToken token, |
|
|
|
[CanBeNull] string identifier, CancellationToken cancellationToken) |
|
|
|
/// <inheritdoc/>
|
|
|
|
public virtual ValueTask SetAuthorizationIdAsync(TToken token, string? identifier, CancellationToken cancellationToken) |
|
|
|
{ |
|
|
|
if (token == null) |
|
|
|
{ |
|
|
|
@ -793,15 +580,8 @@ namespace OpenIddict.MongoDb |
|
|
|
return default; |
|
|
|
} |
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
/// Sets the creation date associated with a token.
|
|
|
|
/// </summary>
|
|
|
|
/// <param name="token">The token.</param>
|
|
|
|
/// <param name="date">The creation date.</param>
|
|
|
|
/// <param name="cancellationToken">The <see cref="CancellationToken"/> that can be used to abort the operation.</param>
|
|
|
|
/// <returns>A <see cref="ValueTask"/> that can be used to monitor the asynchronous operation.</returns>
|
|
|
|
public virtual ValueTask SetCreationDateAsync([NotNull] TToken token, |
|
|
|
[CanBeNull] DateTimeOffset? date, CancellationToken cancellationToken) |
|
|
|
/// <inheritdoc/>
|
|
|
|
public virtual ValueTask SetCreationDateAsync(TToken token, DateTimeOffset? date, CancellationToken cancellationToken) |
|
|
|
{ |
|
|
|
if (token == null) |
|
|
|
{ |
|
|
|
@ -813,15 +593,8 @@ namespace OpenIddict.MongoDb |
|
|
|
return default; |
|
|
|
} |
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
/// Sets the expiration date associated with a token.
|
|
|
|
/// </summary>
|
|
|
|
/// <param name="token">The token.</param>
|
|
|
|
/// <param name="date">The expiration date.</param>
|
|
|
|
/// <param name="cancellationToken">The <see cref="CancellationToken"/> that can be used to abort the operation.</param>
|
|
|
|
/// <returns>A <see cref="ValueTask"/> that can be used to monitor the asynchronous operation.</returns>
|
|
|
|
public virtual ValueTask SetExpirationDateAsync([NotNull] TToken token, |
|
|
|
[CanBeNull] DateTimeOffset? date, CancellationToken cancellationToken) |
|
|
|
/// <inheritdoc/>
|
|
|
|
public virtual ValueTask SetExpirationDateAsync(TToken token, DateTimeOffset? date, CancellationToken cancellationToken) |
|
|
|
{ |
|
|
|
if (token == null) |
|
|
|
{ |
|
|
|
@ -833,14 +606,8 @@ namespace OpenIddict.MongoDb |
|
|
|
return default; |
|
|
|
} |
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
/// Sets the payload associated with a token.
|
|
|
|
/// </summary>
|
|
|
|
/// <param name="token">The token.</param>
|
|
|
|
/// <param name="payload">The payload associated with the token.</param>
|
|
|
|
/// <param name="cancellationToken">The <see cref="CancellationToken"/> that can be used to abort the operation.</param>
|
|
|
|
/// <returns>A <see cref="ValueTask"/> that can be used to monitor the asynchronous operation.</returns>
|
|
|
|
public virtual ValueTask SetPayloadAsync([NotNull] TToken token, [CanBeNull] string payload, CancellationToken cancellationToken) |
|
|
|
/// <inheritdoc/>
|
|
|
|
public virtual ValueTask SetPayloadAsync(TToken token, string? payload, CancellationToken cancellationToken) |
|
|
|
{ |
|
|
|
if (token == null) |
|
|
|
{ |
|
|
|
@ -852,15 +619,9 @@ namespace OpenIddict.MongoDb |
|
|
|
return default; |
|
|
|
} |
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
/// Sets the additional properties associated with a token.
|
|
|
|
/// </summary>
|
|
|
|
/// <param name="token">The token.</param>
|
|
|
|
/// <param name="properties">The additional properties associated with the token.</param>
|
|
|
|
/// <param name="cancellationToken">The <see cref="CancellationToken"/> that can be used to abort the operation.</param>
|
|
|
|
/// <returns>A <see cref="ValueTask"/> that can be used to monitor the asynchronous operation.</returns>
|
|
|
|
public virtual ValueTask SetPropertiesAsync([NotNull] TToken token, |
|
|
|
[CanBeNull] ImmutableDictionary<string, JsonElement> properties, CancellationToken cancellationToken) |
|
|
|
/// <inheritdoc/>
|
|
|
|
public virtual ValueTask SetPropertiesAsync(TToken token, |
|
|
|
ImmutableDictionary<string, JsonElement> properties, CancellationToken cancellationToken) |
|
|
|
{ |
|
|
|
if (token == null) |
|
|
|
{ |
|
|
|
@ -883,16 +644,8 @@ namespace OpenIddict.MongoDb |
|
|
|
return default; |
|
|
|
} |
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
/// Sets the reference identifier associated with a token.
|
|
|
|
/// Note: depending on the manager used to create the token,
|
|
|
|
/// the reference identifier may be hashed for security reasons.
|
|
|
|
/// </summary>
|
|
|
|
/// <param name="token">The token.</param>
|
|
|
|
/// <param name="identifier">The reference identifier associated with the token.</param>
|
|
|
|
/// <param name="cancellationToken">The <see cref="CancellationToken"/> that can be used to abort the operation.</param>
|
|
|
|
/// <returns>A <see cref="ValueTask"/> that can be used to monitor the asynchronous operation.</returns>
|
|
|
|
public virtual ValueTask SetReferenceIdAsync([NotNull] TToken token, [CanBeNull] string identifier, CancellationToken cancellationToken) |
|
|
|
/// <inheritdoc/>
|
|
|
|
public virtual ValueTask SetReferenceIdAsync(TToken token, string? identifier, CancellationToken cancellationToken) |
|
|
|
{ |
|
|
|
if (token == null) |
|
|
|
{ |
|
|
|
@ -904,14 +657,8 @@ namespace OpenIddict.MongoDb |
|
|
|
return default; |
|
|
|
} |
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
/// Sets the status associated with a token.
|
|
|
|
/// </summary>
|
|
|
|
/// <param name="token">The token.</param>
|
|
|
|
/// <param name="status">The status associated with the authorization.</param>
|
|
|
|
/// <param name="cancellationToken">The <see cref="CancellationToken"/> that can be used to abort the operation.</param>
|
|
|
|
/// <returns>A <see cref="ValueTask"/> that can be used to monitor the asynchronous operation.</returns>
|
|
|
|
public virtual ValueTask SetStatusAsync([NotNull] TToken token, [CanBeNull] string status, CancellationToken cancellationToken) |
|
|
|
/// <inheritdoc/>
|
|
|
|
public virtual ValueTask SetStatusAsync(TToken token, string? status, CancellationToken cancellationToken) |
|
|
|
{ |
|
|
|
if (token == null) |
|
|
|
{ |
|
|
|
@ -923,14 +670,8 @@ namespace OpenIddict.MongoDb |
|
|
|
return default; |
|
|
|
} |
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
/// Sets the subject associated with a token.
|
|
|
|
/// </summary>
|
|
|
|
/// <param name="token">The token.</param>
|
|
|
|
/// <param name="subject">The subject associated with the token.</param>
|
|
|
|
/// <param name="cancellationToken">The <see cref="CancellationToken"/> that can be used to abort the operation.</param>
|
|
|
|
/// <returns>A <see cref="ValueTask"/> that can be used to monitor the asynchronous operation.</returns>
|
|
|
|
public virtual ValueTask SetSubjectAsync([NotNull] TToken token, [CanBeNull] string subject, CancellationToken cancellationToken) |
|
|
|
/// <inheritdoc/>
|
|
|
|
public virtual ValueTask SetSubjectAsync(TToken token, string? subject, CancellationToken cancellationToken) |
|
|
|
{ |
|
|
|
if (token == null) |
|
|
|
{ |
|
|
|
@ -942,14 +683,8 @@ namespace OpenIddict.MongoDb |
|
|
|
return default; |
|
|
|
} |
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
/// Sets the token type associated with a token.
|
|
|
|
/// </summary>
|
|
|
|
/// <param name="token">The token.</param>
|
|
|
|
/// <param name="type">The token type associated with the token.</param>
|
|
|
|
/// <param name="cancellationToken">The <see cref="CancellationToken"/> that can be used to abort the operation.</param>
|
|
|
|
/// <returns>A <see cref="ValueTask"/> that can be used to monitor the asynchronous operation.</returns>
|
|
|
|
public virtual ValueTask SetTypeAsync([NotNull] TToken token, [CanBeNull] string type, CancellationToken cancellationToken) |
|
|
|
/// <inheritdoc/>
|
|
|
|
public virtual ValueTask SetTypeAsync(TToken token, string? type, CancellationToken cancellationToken) |
|
|
|
{ |
|
|
|
if (token == null) |
|
|
|
{ |
|
|
|
@ -961,13 +696,8 @@ namespace OpenIddict.MongoDb |
|
|
|
return default; |
|
|
|
} |
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
/// Updates an existing token.
|
|
|
|
/// </summary>
|
|
|
|
/// <param name="token">The token to update.</param>
|
|
|
|
/// <param name="cancellationToken">The <see cref="CancellationToken"/> that can be used to abort the operation.</param>
|
|
|
|
/// <returns>A <see cref="ValueTask"/> that can be used to monitor the asynchronous operation.</returns>
|
|
|
|
public virtual async ValueTask UpdateAsync([NotNull] TToken token, CancellationToken cancellationToken) |
|
|
|
/// <inheritdoc/>
|
|
|
|
public virtual async ValueTask UpdateAsync(TToken token, CancellationToken cancellationToken) |
|
|
|
{ |
|
|
|
if (token == null) |
|
|
|
{ |
|
|
|
|