Add CT parameter to IRefreshTokenService and ITokenRevocationResponseGenerator, flow through all implementations and tests

This commit is contained in:
Damian Hickey 2026-02-20 18:15:19 +01:00
parent fd3aab8b0b
commit 5547504233
11 changed files with 71 additions and 74 deletions

View file

@ -112,7 +112,7 @@ internal class TokenRevocationEndpoint : IEndpointHandler
}
_logger.LogTrace("Calling into token revocation response generator: {type}", _responseGenerator.GetType().FullName);
var response = await _responseGenerator.ProcessAsync(requestValidationResult);
var response = await _responseGenerator.ProcessAsync(requestValidationResult, context.RequestAborted);
if (response.Success)
{

View file

@ -216,7 +216,7 @@ public class TokenResponseGenerator : ITokenResponseGenerator
RefreshToken = request.ValidatedRequest.RefreshToken,
Client = request.ValidatedRequest.Client,
MustUpdate = mustUpdate
});
}, ct);
return new TokenResponse
{
@ -449,7 +449,7 @@ public class TokenResponseGenerator : ITokenResponseGenerator
RequestedResourceIndicator = request.RequestedResourceIndicator,
ProofType = request.ProofType
};
var refreshToken = await RefreshTokenService.CreateRefreshTokenAsync(rtRequest);
var refreshToken = await RefreshTokenService.CreateRefreshTokenAsync(rtRequest, ct);
return (accessToken, refreshToken);
}

View file

@ -51,12 +51,8 @@ public class TokenRevocationResponseGenerator : ITokenRevocationResponseGenerato
Logger = logger;
}
/// <summary>
/// Creates the revocation endpoint response and processes the revocation request.
/// </summary>
/// <param name="validationResult">The userinfo request validation result.</param>
/// <returns></returns>
public virtual async Task<TokenRevocationResponse> ProcessAsync(TokenRevocationRequestValidationResult validationResult)
/// <inheritdoc/>
public virtual async Task<TokenRevocationResponse> ProcessAsync(TokenRevocationRequestValidationResult validationResult, CT ct)
{
using var activity = Tracing.BasicActivitySource.StartActivity("TokenRevocationResponseGenerator.Process");
@ -70,22 +66,22 @@ public class TokenRevocationResponseGenerator : ITokenRevocationResponseGenerato
if (validationResult.TokenTypeHint == Constants.TokenTypeHints.AccessToken)
{
Logger.LogTrace("Hint was for access token");
response.Success = await RevokeAccessTokenAsync(validationResult);
response.Success = await RevokeAccessTokenAsync(validationResult, ct);
}
else if (validationResult.TokenTypeHint == Constants.TokenTypeHints.RefreshToken)
{
Logger.LogTrace("Hint was for refresh token");
response.Success = await RevokeRefreshTokenAsync(validationResult);
response.Success = await RevokeRefreshTokenAsync(validationResult, ct);
}
else
{
Logger.LogTrace("No hint for token type");
response.Success = await RevokeAccessTokenAsync(validationResult);
response.Success = await RevokeAccessTokenAsync(validationResult, ct);
if (!response.Success)
{
response.Success = await RevokeRefreshTokenAsync(validationResult);
response.Success = await RevokeRefreshTokenAsync(validationResult, ct);
response.TokenType = Constants.TokenTypeHints.RefreshToken;
}
else
@ -100,16 +96,16 @@ public class TokenRevocationResponseGenerator : ITokenRevocationResponseGenerato
/// <summary>
/// Revoke access token only if it belongs to client doing the request.
/// </summary>
protected virtual async Task<bool> RevokeAccessTokenAsync(TokenRevocationRequestValidationResult validationResult)
protected virtual async Task<bool> RevokeAccessTokenAsync(TokenRevocationRequestValidationResult validationResult, CT ct)
{
var token = await ReferenceTokenStore.GetReferenceTokenAsync(validationResult.Token, default);
var token = await ReferenceTokenStore.GetReferenceTokenAsync(validationResult.Token, ct);
if (token != null)
{
if (token.ClientId == validationResult.Client.ClientId)
{
Logger.LogDebug("Access token revoked");
await ReferenceTokenStore.RemoveReferenceTokenAsync(validationResult.Token, default);
await ReferenceTokenStore.RemoveReferenceTokenAsync(validationResult.Token, ct);
}
else
{
@ -125,17 +121,17 @@ public class TokenRevocationResponseGenerator : ITokenRevocationResponseGenerato
/// <summary>
/// Revoke refresh token only if it belongs to client doing the request
/// </summary>
protected virtual async Task<bool> RevokeRefreshTokenAsync(TokenRevocationRequestValidationResult validationResult)
protected virtual async Task<bool> RevokeRefreshTokenAsync(TokenRevocationRequestValidationResult validationResult, CT ct)
{
var token = await RefreshTokenStore.GetRefreshTokenAsync(validationResult.Token, default);
var token = await RefreshTokenStore.GetRefreshTokenAsync(validationResult.Token, ct);
if (token != null)
{
if (token.ClientId == validationResult.Client.ClientId)
{
Logger.LogDebug("Refresh token revoked");
await RefreshTokenStore.RemoveRefreshTokenAsync(validationResult.Token, default);
await ReferenceTokenStore.RemoveReferenceTokensAsync(token.SubjectId, token.ClientId, token.SessionId, default);
await RefreshTokenStore.RemoveRefreshTokenAsync(validationResult.Token, ct);
await ReferenceTokenStore.RemoveReferenceTokensAsync(token.SubjectId, token.ClientId, token.SessionId, ct);
}
else
{

View file

@ -15,6 +15,7 @@ public interface ITokenRevocationResponseGenerator
/// Creates the revocation endpoint response and processes the revocation request.
/// </summary>
/// <param name="validationResult">The userinfo request validation result.</param>
/// <param name="ct">The cancellation token.</param>
/// <returns></returns>
Task<TokenRevocationResponse> ProcessAsync(TokenRevocationRequestValidationResult validationResult);
Task<TokenRevocationResponse> ProcessAsync(TokenRevocationRequestValidationResult validationResult, CT ct);
}

View file

@ -66,13 +66,8 @@ public class DefaultRefreshTokenService : IRefreshTokenService
Logger = logger;
}
/// <summary>
/// Validates a refresh token
/// </summary>
/// <param name="tokenHandle">The token handle.</param>
/// <param name="client">The client.</param>
/// <returns></returns>
public virtual async Task<TokenValidationResult> ValidateRefreshTokenAsync(string tokenHandle, Client client)
/// <inheritdoc/>
public virtual async Task<TokenValidationResult> ValidateRefreshTokenAsync(string tokenHandle, Client client, CT ct)
{
using var activity = Tracing.ServiceActivitySource.StartActivity("DefaultRefreshTokenService.ValidateRefreshToken");
@ -87,7 +82,7 @@ public class DefaultRefreshTokenService : IRefreshTokenService
/////////////////////////////////////////////
// check if refresh token is valid
/////////////////////////////////////////////
var refreshToken = await RefreshTokenStore.GetRefreshTokenAsync(tokenHandle, default);
var refreshToken = await RefreshTokenStore.GetRefreshTokenAsync(tokenHandle, ct);
if (refreshToken == null)
{
Logger.LogWarning("Invalid refresh token");
@ -174,7 +169,7 @@ public class DefaultRefreshTokenService : IRefreshTokenService
/// <returns>
/// The refresh token handle
/// </returns>
public virtual async Task<string> CreateRefreshTokenAsync(RefreshTokenCreationRequest request)
public virtual async Task<string> CreateRefreshTokenAsync(RefreshTokenCreationRequest request, CT ct)
{
using var activity = Tracing.ServiceActivitySource.StartActivity("DefaultRefreshTokenService.CreateRefreshToken");
@ -218,7 +213,7 @@ public class DefaultRefreshTokenService : IRefreshTokenService
};
refreshToken.SetAccessToken(request.AccessToken, request.RequestedResourceIndicator);
var handle = await RefreshTokenStore.StoreRefreshTokenAsync(refreshToken, default);
var handle = await RefreshTokenStore.StoreRefreshTokenAsync(refreshToken, ct);
return handle;
}
@ -228,7 +223,7 @@ public class DefaultRefreshTokenService : IRefreshTokenService
/// <returns>
/// The refresh token handle
/// </returns>
public virtual async Task<string> UpdateRefreshTokenAsync(RefreshTokenUpdateRequest request)
public virtual async Task<string> UpdateRefreshTokenAsync(RefreshTokenUpdateRequest request, CT ct)
{
using var activity = Tracing.ServiceActivitySource.StartActivity("DefaultTokenCreationService.UpdateRefreshToken");
@ -245,7 +240,7 @@ public class DefaultRefreshTokenService : IRefreshTokenService
{
Logger.LogDebug("Token usage is one-time only and refresh behavior is delete. Deleting current handle, and generating new handle");
await RefreshTokenStore.RemoveRefreshTokenAsync(handle, default);
await RefreshTokenStore.RemoveRefreshTokenAsync(handle, ct);
}
else
{
@ -255,7 +250,7 @@ public class DefaultRefreshTokenService : IRefreshTokenService
if (request.RefreshToken.ConsumedTime == null)
{
request.RefreshToken.ConsumedTime = TimeProvider.GetUtcNow().UtcDateTime;
await RefreshTokenStore.UpdateRefreshTokenAsync(handle, request.RefreshToken, default);
await RefreshTokenStore.UpdateRefreshTokenAsync(handle, request.RefreshToken, ct);
}
}
@ -292,12 +287,12 @@ public class DefaultRefreshTokenService : IRefreshTokenService
{
// set it to null so that we save non-consumed token
request.RefreshToken.ConsumedTime = null;
handle = await RefreshTokenStore.StoreRefreshTokenAsync(request.RefreshToken, default);
handle = await RefreshTokenStore.StoreRefreshTokenAsync(request.RefreshToken, ct);
Logger.LogDebug("Created refresh token in store");
}
else if (needsUpdate)
{
await RefreshTokenStore.UpdateRefreshTokenAsync(handle, request.RefreshToken, default);
await RefreshTokenStore.UpdateRefreshTokenAsync(handle, request.RefreshToken, ct);
Logger.LogDebug("Updated refresh token in store");
}
else

View file

@ -43,9 +43,9 @@ internal class ServerSideSessionRefreshTokenService : IRefreshTokenService
/// <inheritdoc/>
public virtual async Task<TokenValidationResult> ValidateRefreshTokenAsync(string tokenHandle, Client client)
public virtual async Task<TokenValidationResult> ValidateRefreshTokenAsync(string tokenHandle, Client client, CT ct)
{
var result = await Inner.ValidateRefreshTokenAsync(tokenHandle, client);
var result = await Inner.ValidateRefreshTokenAsync(tokenHandle, client, ct);
using var activity = Tracing.ServiceActivitySource.StartActivity("ServerSideSessionRefreshTokenService.ValidateRefreshToken");
@ -69,8 +69,8 @@ internal class ServerSideSessionRefreshTokenService : IRefreshTokenService
}
/// <inheritdoc/>
public Task<string> CreateRefreshTokenAsync(RefreshTokenCreationRequest request) => Inner.CreateRefreshTokenAsync(request);
public Task<string> CreateRefreshTokenAsync(RefreshTokenCreationRequest request, CT ct) => Inner.CreateRefreshTokenAsync(request, ct);
/// <inheritdoc/>
public Task<string> UpdateRefreshTokenAsync(RefreshTokenUpdateRequest request) => Inner.UpdateRefreshTokenAsync(request);
public Task<string> UpdateRefreshTokenAsync(RefreshTokenUpdateRequest request, CT ct) => Inner.UpdateRefreshTokenAsync(request, ct);
}

View file

@ -19,22 +19,27 @@ public interface IRefreshTokenService
/// </summary>
/// <param name="token">The refresh token.</param>
/// <param name="client">The client.</param>
/// <param name="ct">The cancellation token.</param>
/// <returns></returns>
Task<TokenValidationResult> ValidateRefreshTokenAsync(string token, Client client);
Task<TokenValidationResult> ValidateRefreshTokenAsync(string token, Client client, CT ct);
/// <summary>
/// Creates the refresh token.
/// </summary>
/// <param name="request">The refresh token creation request.</param>
/// <param name="ct">The cancellation token.</param>
/// <returns>
/// The refresh token handle
/// </returns>
Task<string> CreateRefreshTokenAsync(RefreshTokenCreationRequest request);
Task<string> CreateRefreshTokenAsync(RefreshTokenCreationRequest request, CT ct);
/// <summary>
/// Updates the refresh token.
/// </summary>
/// <param name="request">The refresh token update request.</param>
/// <param name="ct">The cancellation token.</param>
/// <returns>
/// The refresh token handle
/// </returns>
Task<string> UpdateRefreshTokenAsync(RefreshTokenUpdateRequest request);
Task<string> UpdateRefreshTokenAsync(RefreshTokenUpdateRequest request, CT ct);
}

View file

@ -128,13 +128,13 @@ internal class IntrospectionRequestValidator : IIntrospectionRequestValidator
{
_logger.LogDebug("Failed to validate token as access token. Possible incorrect token_type_hint parameter.");
}
claims = await GetRefreshTokenClaimsAsync(token, client);
claims = await GetRefreshTokenClaimsAsync(token, client, ct);
}
}
else
{
// try refresh token
claims = await GetRefreshTokenClaimsAsync(token, client);
claims = await GetRefreshTokenClaimsAsync(token, client, ct);
if (claims == null)
{
// fall back to access token
@ -181,9 +181,9 @@ internal class IntrospectionRequestValidator : IIntrospectionRequestValidator
/// <summary>
/// Attempt to obtain the claims for a token as a refresh token for a client.
/// </summary>
private async Task<IEnumerable<Claim>> GetRefreshTokenClaimsAsync(string token, Client client)
private async Task<IEnumerable<Claim>> GetRefreshTokenClaimsAsync(string token, Client client, CT ct)
{
var refreshValidationResult = await _refreshTokenService.ValidateRefreshTokenAsync(token, client);
var refreshValidationResult = await _refreshTokenService.ValidateRefreshTokenAsync(token, client, ct);
if (!refreshValidationResult.IsError)
{
var iat = ((DateTimeOffset)refreshValidationResult.RefreshToken.CreationTime).ToUnixTimeSeconds();

View file

@ -698,7 +698,7 @@ internal class TokenRequestValidator : ITokenRequestValidator
return Invalid(OidcConstants.TokenErrors.InvalidGrant);
}
var result = await _refreshTokenService.ValidateRefreshTokenAsync(refreshTokenHandle, _validatedRequest.Client);
var result = await _refreshTokenService.ValidateRefreshTokenAsync(refreshTokenHandle, _validatedRequest.Client, default);
if (result.IsError)
{

View file

@ -309,7 +309,7 @@ public class ServerSideSessionTests
RedirectUri = "https://client/callback"
});
( await _grantStore.GetAllAsync(new PersistedGrantFilter { SubjectId = "alice" }, _ct)).ShouldNotBeEmpty();
(await _grantStore.GetAllAsync(new PersistedGrantFilter { SubjectId = "alice" }, _ct)).ShouldNotBeEmpty();
await _sessionMgmt.RemoveSessionsAsync(new RemoveSessionsContext
{
@ -320,7 +320,7 @@ public class ServerSideSessionTests
SendBackchannelLogoutNotification = false
});
( await _grantStore.GetAllAsync(new PersistedGrantFilter { SubjectId = "alice" }, _ct)).ShouldBeEmpty();
(await _grantStore.GetAllAsync(new PersistedGrantFilter { SubjectId = "alice" }, _ct)).ShouldBeEmpty();
}
[Fact]
@ -338,7 +338,7 @@ public class ServerSideSessionTests
RedirectUri = "https://client/callback"
});
( await _grantStore.GetAllAsync(new PersistedGrantFilter { SubjectId = "alice" }, _ct)).ShouldNotBeEmpty();
(await _grantStore.GetAllAsync(new PersistedGrantFilter { SubjectId = "alice" }, _ct)).ShouldNotBeEmpty();
await _sessionMgmt.RemoveSessionsAsync(new RemoveSessionsContext
{
@ -350,7 +350,7 @@ public class ServerSideSessionTests
ClientIds = new[] { "foo" }
});
( await _grantStore.GetAllAsync(new PersistedGrantFilter { SubjectId = "alice" }, _ct)).ShouldNotBeEmpty();
(await _grantStore.GetAllAsync(new PersistedGrantFilter { SubjectId = "alice" }, _ct)).ShouldNotBeEmpty();
}
[Fact]
@ -535,7 +535,7 @@ public class ServerSideSessionTests
RedirectUri = "https://client/callback"
});
( await _grantStore.GetAllAsync(new PersistedGrantFilter { SubjectId = "alice" }, _ct)).ShouldNotBeEmpty();
(await _grantStore.GetAllAsync(new PersistedGrantFilter { SubjectId = "alice" }, _ct)).ShouldNotBeEmpty();
var session = (await _sessionStore.GetSessionsAsync(new SessionFilter { SubjectId = "alice" })).Single();
session.Expires = System.DateTime.UtcNow.AddMinutes(-1);
@ -543,7 +543,7 @@ public class ServerSideSessionTests
await Task.Delay(1000);
( await _grantStore.GetAllAsync(new PersistedGrantFilter { SubjectId = "alice" }, _ct)).ShouldBeEmpty();
(await _grantStore.GetAllAsync(new PersistedGrantFilter { SubjectId = "alice" }, _ct)).ShouldBeEmpty();
}
[Fact]
@ -561,11 +561,11 @@ public class ServerSideSessionTests
RedirectUri = "https://client/callback"
});
( await _grantStore.GetAllAsync(new PersistedGrantFilter { SubjectId = "alice" }, _ct)).ShouldNotBeEmpty();
(await _grantStore.GetAllAsync(new PersistedGrantFilter { SubjectId = "alice" }, _ct)).ShouldNotBeEmpty();
await _pipeline.LogoutAsync();
( await _grantStore.GetAllAsync(new PersistedGrantFilter { SubjectId = "alice" }, _ct)).ShouldBeEmpty();
(await _grantStore.GetAllAsync(new PersistedGrantFilter { SubjectId = "alice" }, _ct)).ShouldBeEmpty();
}
[Fact]

View file

@ -47,7 +47,7 @@ public class DefaultRefreshTokenServiceTests
var client = new Client();
var accessToken = new Token();
var handle = await _subject.CreateRefreshTokenAsync(new RefreshTokenCreationRequest { Subject = _user, AccessToken = accessToken, Client = client });
var handle = await _subject.CreateRefreshTokenAsync(new RefreshTokenCreationRequest { Subject = _user, AccessToken = accessToken, Client = client }, _ct);
(await _store.GetRefreshTokenAsync(handle, _ct)).ShouldNotBeNull();
}
@ -63,7 +63,7 @@ public class DefaultRefreshTokenServiceTests
AbsoluteRefreshTokenLifetime = 10
};
var handle = await _subject.CreateRefreshTokenAsync(new RefreshTokenCreationRequest { Subject = _user, AccessToken = new Token(), Client = client });
var handle = await _subject.CreateRefreshTokenAsync(new RefreshTokenCreationRequest { Subject = _user, AccessToken = new Token(), Client = client }, _ct);
var refreshToken = (await _store.GetRefreshTokenAsync(handle, _ct));
@ -83,7 +83,7 @@ public class DefaultRefreshTokenServiceTests
AbsoluteRefreshTokenLifetime = 10
};
var handle = await _subject.CreateRefreshTokenAsync(new RefreshTokenCreationRequest { Subject = _user, AccessToken = new Token(), Client = client });
var handle = await _subject.CreateRefreshTokenAsync(new RefreshTokenCreationRequest { Subject = _user, AccessToken = new Token(), Client = client }, _ct);
var refreshToken = (await _store.GetRefreshTokenAsync(handle, _ct));
@ -102,7 +102,7 @@ public class DefaultRefreshTokenServiceTests
SlidingRefreshTokenLifetime = 10
};
var handle = await _subject.CreateRefreshTokenAsync(new RefreshTokenCreationRequest { Subject = _user, AccessToken = new Token(), Client = client });
var handle = await _subject.CreateRefreshTokenAsync(new RefreshTokenCreationRequest { Subject = _user, AccessToken = new Token(), Client = client }, _ct);
var refreshToken = (await _store.GetRefreshTokenAsync(handle, _ct));
@ -127,7 +127,7 @@ public class DefaultRefreshTokenServiceTests
var handle = await _store.StoreRefreshTokenAsync(refreshToken, _ct);
(await _subject.UpdateRefreshTokenAsync(new RefreshTokenUpdateRequest { Handle = handle, RefreshToken = refreshToken, Client = client }))
(await _subject.UpdateRefreshTokenAsync(new RefreshTokenUpdateRequest { Handle = handle, RefreshToken = refreshToken, Client = client }, _ct))
.ShouldNotBeNull()
.ShouldNotBe(handle);
}
@ -153,7 +153,7 @@ public class DefaultRefreshTokenServiceTests
}, _ct);
var refreshToken = await _store.GetRefreshTokenAsync(handle, _ct);
var newHandle = await _subject.UpdateRefreshTokenAsync(new RefreshTokenUpdateRequest { Handle = handle, RefreshToken = refreshToken, Client = client });
var newHandle = await _subject.UpdateRefreshTokenAsync(new RefreshTokenUpdateRequest { Handle = handle, RefreshToken = refreshToken, Client = client }, _ct);
newHandle.ShouldBe(handle);
@ -184,7 +184,7 @@ public class DefaultRefreshTokenServiceTests
}, _ct);
var refreshToken = await _store.GetRefreshTokenAsync(handle, _ct);
var newHandle = await _subject.UpdateRefreshTokenAsync(new RefreshTokenUpdateRequest { Handle = handle, RefreshToken = refreshToken, Client = client });
var newHandle = await _subject.UpdateRefreshTokenAsync(new RefreshTokenUpdateRequest { Handle = handle, RefreshToken = refreshToken, Client = client }, _ct);
newHandle.ShouldBe(handle);
@ -215,7 +215,7 @@ public class DefaultRefreshTokenServiceTests
}, _ct);
var refreshToken = await _store.GetRefreshTokenAsync(handle, _ct);
var newHandle = await _subject.UpdateRefreshTokenAsync(new RefreshTokenUpdateRequest { Handle = handle, RefreshToken = refreshToken, Client = client });
var newHandle = await _subject.UpdateRefreshTokenAsync(new RefreshTokenUpdateRequest { Handle = handle, RefreshToken = refreshToken, Client = client }, _ct);
newHandle.ShouldBe(handle);
@ -248,7 +248,7 @@ public class DefaultRefreshTokenServiceTests
}, _ct);
var refreshToken = await _store.GetRefreshTokenAsync(handle, _ct);
var newHandle = await _subject.UpdateRefreshTokenAsync(new RefreshTokenUpdateRequest { Handle = handle, RefreshToken = refreshToken, Client = client });
var newHandle = await _subject.UpdateRefreshTokenAsync(new RefreshTokenUpdateRequest { Handle = handle, RefreshToken = refreshToken, Client = client }, _ct);
newHandle.ShouldNotBeNull().ShouldNotBe(handle);
@ -281,7 +281,7 @@ public class DefaultRefreshTokenServiceTests
var now = DateTime.UtcNow;
_timeProvider.SetUtcNow(now);
var newHandle = await _subject.UpdateRefreshTokenAsync(new RefreshTokenUpdateRequest { Handle = handle, RefreshToken = refreshToken, Client = client });
var newHandle = await _subject.UpdateRefreshTokenAsync(new RefreshTokenUpdateRequest { Handle = handle, RefreshToken = refreshToken, Client = client }, _ct);
var oldToken = await _store.GetRefreshTokenAsync(handle, _ct);
var newToken = await _store.GetRefreshTokenAsync(newHandle, _ct);
@ -316,7 +316,7 @@ public class DefaultRefreshTokenServiceTests
var now = DateTime.UtcNow;
_timeProvider.SetUtcNow(now);
var newHandle = await _subject.UpdateRefreshTokenAsync(new RefreshTokenUpdateRequest { Handle = handle, RefreshToken = refreshToken, Client = client });
var newHandle = await _subject.UpdateRefreshTokenAsync(new RefreshTokenUpdateRequest { Handle = handle, RefreshToken = refreshToken, Client = client }, _ct);
var oldToken = await _store.GetRefreshTokenAsync(handle, _ct);
var newToken = await _store.GetRefreshTokenAsync(newHandle, _ct);
@ -337,7 +337,7 @@ public class DefaultRefreshTokenServiceTests
RefreshTokenUsage = TokenUsage.OneTimeOnly
};
var result = await _subject.ValidateRefreshTokenAsync("invalid", client);
var result = await _subject.ValidateRefreshTokenAsync("invalid", client, _ct);
result.IsError.ShouldBeTrue();
}
@ -364,7 +364,7 @@ public class DefaultRefreshTokenServiceTests
var now = DateTime.UtcNow;
_timeProvider.SetUtcNow(now);
var result = await _subject.ValidateRefreshTokenAsync(handle, client);
var result = await _subject.ValidateRefreshTokenAsync(handle, client, _ct);
result.IsError.ShouldBeTrue();
}
@ -392,7 +392,7 @@ public class DefaultRefreshTokenServiceTests
var now = DateTime.UtcNow;
_timeProvider.SetUtcNow(now);
var result = await _subject.ValidateRefreshTokenAsync(handle, client);
var result = await _subject.ValidateRefreshTokenAsync(handle, client, _ct);
result.IsError.ShouldBeTrue();
}
@ -420,7 +420,7 @@ public class DefaultRefreshTokenServiceTests
var now = DateTime.UtcNow.AddSeconds(20);
_timeProvider.SetUtcNow(now);
var result = await _subject.ValidateRefreshTokenAsync(handle, client);
var result = await _subject.ValidateRefreshTokenAsync(handle, client, _ct);
result.IsError.ShouldBeTrue();
}
@ -449,7 +449,7 @@ public class DefaultRefreshTokenServiceTests
var now = DateTime.UtcNow;
_timeProvider.SetUtcNow(now);
var result = await _subject.ValidateRefreshTokenAsync(handle, client);
var result = await _subject.ValidateRefreshTokenAsync(handle, client, _ct);
result.IsError.ShouldBeTrue();
}
@ -477,7 +477,7 @@ public class DefaultRefreshTokenServiceTests
var now = DateTime.UtcNow;
_timeProvider.SetUtcNow(now);
var result = await _subject.ValidateRefreshTokenAsync(handle, client);
var result = await _subject.ValidateRefreshTokenAsync(handle, client, _ct);
result.IsError.ShouldBeFalse();
}
@ -506,7 +506,7 @@ public class DefaultRefreshTokenServiceTests
var now = DateTime.UtcNow;
_timeProvider.SetUtcNow(now);
var result = await _subject.ValidateRefreshTokenAsync("key", client);
var result = await _subject.ValidateRefreshTokenAsync("key", client, _ct);
result.IsError.ShouldBeFalse();
}