mirror of
https://github.com/DuendeSoftware/products
synced 2026-05-24 01:18:22 +00:00
Add CT parameter to IRefreshTokenService and ITokenRevocationResponseGenerator, flow through all implementations and tests
This commit is contained in:
parent
fd3aab8b0b
commit
5547504233
11 changed files with 71 additions and 74 deletions
|
|
@ -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)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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
|
||||
{
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -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]
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in a new issue