Skip to content

Commit 02aa68a

Browse files
changes made together with Joe
implemented some convention tests
1 parent e60135a commit 02aa68a

File tree

74 files changed

+451
-240
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

74 files changed

+451
-240
lines changed

access-token-management/perf/Perf.TokenEndpoint/Program.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -89,7 +89,7 @@
8989

9090
app.MapGet("/ok", () => "ok");
9191

92-
app.MapGet("/token", async (IClientCredentialsTokenManagementService svc, CancellationToken ct) =>
92+
app.MapGet("/token", async (IClientCredentialsTokenManager svc, CancellationToken ct) =>
9393
{
9494
return await svc.GetAccessTokenAsync("c1");
9595
});

access-token-management/samples/Web/Controllers/HomeController.cs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -15,13 +15,13 @@ namespace Web.Controllers;
1515
public class HomeController : Controller
1616
{
1717
private readonly IHttpClientFactory _httpClientFactory;
18-
private readonly IUserTokenManagementService _tokenManagementService;
18+
private readonly IUserTokenManager _tokenManager;
1919
private readonly SampleConfiguration _configuration;
2020

21-
public HomeController(IHttpClientFactory httpClientFactory, IUserTokenManagementService tokenManagementService, IOptions<SampleConfiguration> options)
21+
public HomeController(IHttpClientFactory httpClientFactory, IUserTokenManager tokenManager, IOptions<SampleConfiguration> options)
2222
{
2323
_httpClientFactory = httpClientFactory;
24-
_tokenManagementService = tokenManagementService;
24+
_tokenManager = tokenManager;
2525
_configuration = options.Value;
2626
}
2727

@@ -34,7 +34,7 @@ public HomeController(IHttpClientFactory httpClientFactory, IUserTokenManagement
3434

3535
public async Task<IActionResult> CallApiAsUserManual()
3636
{
37-
UserToken token = await _tokenManagementService.GetAccessTokenAsync(User);
37+
UserToken token = await _tokenManager.GetAccessTokenAsync(User);
3838
var client = _httpClientFactory.CreateClient();
3939
client.SetToken(token.AccessTokenType?.ToScheme().ToString()!, token.AccessToken.ToString());
4040

access-token-management/samples/Web/Startup.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33

44
using System.Security.Cryptography;
55
using System.Text.Json;
6-
using Duende.AccessTokenManagement;
6+
using Duende.AccessTokenManagement.DPoP;
77
using Duende.AccessTokenManagement.OpenIdConnect;
88

99
using Microsoft.IdentityModel.Tokens;
@@ -79,7 +79,7 @@ internal static WebApplication ConfigureServices(this WebApplicationBuilder buil
7979
builder.Services.AddOpenIdConnectAccessTokenManagement(options =>
8080
{
8181
var useDPoP = builder.Configuration.GetValue<bool>("UseDPoP");
82-
options.DPoPJsonWebKey = useDPoP ? DPoPJsonWebKey.Parse(jwk) : null;
82+
options.DPoPJsonWebKey = useDPoP ? DPoPJsonWebKey.ParseOrDefault(jwk) : null;
8383
});
8484

8585
// registers HTTP client that uses the managed user access token

access-token-management/samples/WebJarJwt/Controllers/HomeController.cs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -14,12 +14,12 @@ namespace WebJarJwt.Controllers;
1414
public class HomeController : Controller
1515
{
1616
private readonly IHttpClientFactory _httpClientFactory;
17-
private readonly IUserTokenManagementService _tokenManagementService;
17+
private readonly IUserTokenManager _tokenManager;
1818

19-
public HomeController(IHttpClientFactory httpClientFactory, IUserTokenManagementService tokenManagementService)
19+
public HomeController(IHttpClientFactory httpClientFactory, IUserTokenManager tokenManager)
2020
{
2121
_httpClientFactory = httpClientFactory;
22-
_tokenManagementService = tokenManagementService;
22+
_tokenManager = tokenManager;
2323
}
2424

2525
[AllowAnonymous]
@@ -31,7 +31,7 @@ public HomeController(IHttpClientFactory httpClientFactory, IUserTokenManagement
3131

3232
public async Task<IActionResult> CallApiAsUserManual()
3333
{
34-
UserToken token = await _tokenManagementService.GetAccessTokenAsync(User);
34+
UserToken token = await _tokenManager.GetAccessTokenAsync(User);
3535
var client = _httpClientFactory.CreateClient();
3636
client.SetBearerToken(token.AccessToken.ToString()!);
3737

access-token-management/samples/Worker/WorkerManual.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,9 +11,9 @@ public class WorkerManual : BackgroundService
1111
{
1212
private readonly ILogger<WorkerManual> _logger;
1313
private readonly IHttpClientFactory _clientFactory;
14-
private readonly IClientCredentialsTokenManagementService _tokenManagementService;
14+
private readonly IClientCredentialsTokenManager _tokenManagementService;
1515

16-
public WorkerManual(ILogger<WorkerManual> logger, IHttpClientFactory factory, IClientCredentialsTokenManagementService tokenManagementService)
16+
public WorkerManual(ILogger<WorkerManual> logger, IHttpClientFactory factory, IClientCredentialsTokenManager tokenManagementService)
1717
{
1818
_logger = logger;
1919
_clientFactory = factory;

access-token-management/samples/Worker/WorkerManualJwt.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,9 +11,9 @@ public class WorkerManualJwt : BackgroundService
1111
{
1212
private readonly ILogger<WorkerManualJwt> _logger;
1313
private readonly IHttpClientFactory _clientFactory;
14-
private readonly IClientCredentialsTokenManagementService _tokenManagementService;
14+
private readonly IClientCredentialsTokenManager _tokenManagementService;
1515

16-
public WorkerManualJwt(ILogger<WorkerManualJwt> logger, IHttpClientFactory factory, IClientCredentialsTokenManagementService tokenManagementService)
16+
public WorkerManualJwt(ILogger<WorkerManualJwt> logger, IHttpClientFactory factory, IClientCredentialsTokenManager tokenManagementService)
1717
{
1818
_logger = logger;
1919
_clientFactory = factory;

access-token-management/samples/WorkerDI/WorkerManual.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,9 +11,9 @@ public class WorkerManual : BackgroundService
1111
{
1212
private readonly ILogger<WorkerManual> _logger;
1313
private readonly IHttpClientFactory _clientFactory;
14-
private readonly IClientCredentialsTokenManagementService _tokenManagementService;
14+
private readonly IClientCredentialsTokenManager _tokenManagementService;
1515

16-
public WorkerManual(ILogger<WorkerManual> logger, IHttpClientFactory factory, IClientCredentialsTokenManagementService tokenManagementService)
16+
public WorkerManual(ILogger<WorkerManual> logger, IHttpClientFactory factory, IClientCredentialsTokenManager tokenManagementService)
1717
{
1818
_logger = logger;
1919
_clientFactory = factory;

access-token-management/samples/WorkerDI/WorkerManualJwt.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,9 +11,9 @@ public class WorkerManualJwt : BackgroundService
1111
{
1212
private readonly ILogger<WorkerManualJwt> _logger;
1313
private readonly IHttpClientFactory _clientFactory;
14-
private readonly IClientCredentialsTokenManagementService _tokenManagementService;
14+
private readonly IClientCredentialsTokenManager _tokenManagementService;
1515

16-
public WorkerManualJwt(ILogger<WorkerManualJwt> logger, IHttpClientFactory factory, IClientCredentialsTokenManagementService tokenManagementService)
16+
public WorkerManualJwt(ILogger<WorkerManualJwt> logger, IHttpClientFactory factory, IClientCredentialsTokenManager tokenManagementService)
1717
{
1818
_logger = logger;
1919
_clientFactory = factory;

access-token-management/src/AccessTokenManagement.OpenIdConnect/HttpContextExtensions.cs

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
// Licensed under the Apache License, Version 2.0. See LICENSE in the project root for license information.
33

44

5+
using Duende.AccessTokenManagement.DPoP;
56
using Microsoft.AspNetCore.Authentication;
67
using Microsoft.AspNetCore.Http;
78
using Microsoft.Extensions.DependencyInjection;
@@ -26,7 +27,7 @@ public static async Task<TokenResult<UserToken>> GetUserAccessTokenAsync(
2627
UserTokenRequestParameters? parameters = null,
2728
CancellationToken cancellationToken = default)
2829
{
29-
var service = httpContext.RequestServices.GetRequiredService<IUserTokenManagementService>();
30+
var service = httpContext.RequestServices.GetRequiredService<IUserTokenManager>();
3031

3132
return await service.GetAccessTokenAsync(httpContext.User, parameters, cancellationToken).ConfigureAwait(false);
3233
}
@@ -43,7 +44,7 @@ public static async Task RevokeRefreshTokenAsync(
4344
UserTokenRequestParameters? parameters = null,
4445
CancellationToken cancellationToken = default)
4546
{
46-
var service = httpContext.RequestServices.GetRequiredService<IUserTokenManagementService>();
47+
var service = httpContext.RequestServices.GetRequiredService<IUserTokenManager>();
4748

4849
await service.RevokeRefreshTokenAsync(httpContext.User, parameters, cancellationToken).ConfigureAwait(false);
4950
}
@@ -60,7 +61,7 @@ public static async Task<TokenResult<ClientCredentialsToken>> GetClientAccessTok
6061
UserTokenRequestParameters? parameters = null,
6162
CancellationToken cancellationToken = default)
6263
{
63-
var service = httpContext.RequestServices.GetRequiredService<IClientCredentialsTokenManagementService>();
64+
var service = httpContext.RequestServices.GetRequiredService<IClientCredentialsTokenManager>();
6465
var options = httpContext.RequestServices.GetRequiredService<IOptions<UserTokenManagementOptions>>();
6566
var schemes = httpContext.RequestServices.GetRequiredService<IAuthenticationSchemeProvider>();
6667

access-token-management/src/AccessTokenManagement.OpenIdConnect/IUserTokenEndpointService.cs renamed to access-token-management/src/AccessTokenManagement.OpenIdConnect/IOpenIdConnectUserTokenClient.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ namespace Duende.AccessTokenManagement.OpenIdConnect;
88
/// <summary>
99
/// Abstraction for token endpoint operations
1010
/// </summary>
11-
public interface IUserTokenEndpointService
11+
public interface IOpenIdConnectUserTokenClient
1212
{
1313
/// <summary>
1414
/// Refreshes a user access token.
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ namespace Duende.AccessTokenManagement.OpenIdConnect;
99
/// <summary>
1010
/// Abstraction for managing user access tokens
1111
/// </summary>
12-
public interface IUserTokenManagementService
12+
public interface IUserTokenManager
1313
{
1414
/// <summary>
1515
/// Returns the user access token. If the current token is expired, it will try to refresh it.

access-token-management/src/AccessTokenManagement.OpenIdConnect/Internal/OpenIdConnectClientAccessTokenRetriever.cs

Lines changed: 22 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,18 @@
22
// Licensed under the Apache License, Version 2.0. See LICENSE in the project root for license information.
33

44
using Duende.AccessTokenManagement.DPoP;
5-
6-
using Microsoft.AspNetCore.Http;
5+
using Microsoft.AspNetCore.Authentication;
6+
using Microsoft.Extensions.Options;
77

88
namespace Duende.AccessTokenManagement.OpenIdConnect.Internal;
99

10+
/// <summary>
11+
/// A token retriever that uses the configuration in openid connect to retrieve client credential access tokens
12+
/// </summary>
1013
internal class OpenIdConnectClientAccessTokenRetriever(
11-
IHttpContextAccessor httpContextAccessor,
14+
IClientCredentialsTokenManager tokenManager,
15+
IOptions<UserTokenManagementOptions> options,
16+
IAuthenticationSchemeProvider schemeProvider,
1217
UserTokenRequestParameters? parameters = null)
1318
: AccessTokenRequestHandler.ITokenRetriever
1419
{
@@ -27,15 +32,23 @@ internal class OpenIdConnectClientAccessTokenRetriever(
2732
ForceTokenRenewal = request.GetForceRenewal()
2833
};
2934

30-
if (httpContextAccessor.HttpContext == null)
35+
var schemeName = userTokenRequestParameters?.ChallengeScheme ?? options.Value.ChallengeScheme;
36+
37+
if (schemeName == null)
3138
{
32-
throw new InvalidOperationException("HttpContext is null");
39+
var defaultScheme = await schemeProvider.GetDefaultChallengeSchemeAsync().ConfigureAwait(false);
40+
if (defaultScheme == null)
41+
{
42+
throw new InvalidOperationException("Cannot retrieve client access token. No scheme was provided and default challenge scheme was not set.");
43+
}
44+
45+
schemeName = defaultScheme.Name;
3346
}
3447

35-
var getTokenResult = await httpContextAccessor.HttpContext.GetClientAccessTokenAsync(
36-
userTokenRequestParameters,
37-
cancellationToken)
38-
.ConfigureAwait(false);
48+
var getTokenResult = await tokenManager.GetAccessTokenAsync(
49+
OpenIdConnectTokenManagementDefaults.ClientCredentialsClientNamePrefix + schemeName,
50+
userTokenRequestParameters,
51+
cancellationToken).ConfigureAwait(false);
3952

4053
if (getTokenResult.WasSuccessful(out var token, out var error))
4154
{

access-token-management/src/AccessTokenManagement.OpenIdConnect/Internal/OpenIdConnectUserAccessTokenRetriever.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ namespace Duende.AccessTokenManagement.OpenIdConnect.Internal;
77

88
internal class OpenIdConnectUserAccessTokenRetriever(
99
IUserAccessor userAccessor,
10-
IUserTokenManagementService userTokenManagement,
10+
IUserTokenManager userTokenManagement,
1111
UserTokenRequestParameters? parameters = null
1212
) : AccessTokenRequestHandler.ITokenRetriever
1313
{

access-token-management/src/AccessTokenManagement.OpenIdConnect/Internal/UserTokenEndpointService.cs renamed to access-token-management/src/AccessTokenManagement.OpenIdConnect/Internal/OpenIdConnectUserTokenClient.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,13 +15,13 @@ namespace Duende.AccessTokenManagement.OpenIdConnect.Internal;
1515
/// <summary>
1616
/// Implements token endpoint operations using IdentityModel
1717
/// </summary>
18-
internal class UserTokenEndpointService(
18+
internal class OpenIdConnectUserTokenClient(
1919
AccessTokenManagementMetrics metrics,
2020
IOpenIdConnectConfigurationService configurationService,
2121
IOptions<UserTokenManagementOptions> options,
2222
IClientAssertionService clientAssertionService,
2323
IDPoPProofService dPoPProofService,
24-
ILogger<UserTokenEndpointService> logger) : IUserTokenEndpointService
24+
ILogger<OpenIdConnectUserTokenClient> logger) : IOpenIdConnectUserTokenClient
2525
{
2626
/// <inheritdoc/>
2727
public async Task<TokenResult<UserToken>> RefreshAccessTokenAsync(

access-token-management/src/AccessTokenManagement.OpenIdConnect/Internal/StoreTokensInAuthenticationProperties.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
// Licensed under the Apache License, Version 2.0. See LICENSE in the project root for license information.
33

44
using System.Globalization;
5+
using Duende.AccessTokenManagement.DPoP;
56
using Duende.AccessTokenManagement.Internal;
67

78
using Microsoft.AspNetCore.Authentication;

access-token-management/src/AccessTokenManagement.OpenIdConnect/Internal/UserAccessTokenManagementService.cs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -14,14 +14,14 @@ namespace Duende.AccessTokenManagement.OpenIdConnect.Internal;
1414
/// <summary>
1515
/// Implements basic token management logic
1616
/// </summary>
17-
internal class UserAccessAccessTokenManagementService(
17+
internal class UserAccessAccessTokenManager(
1818
AccessTokenManagementMetrics metrics,
1919
IUserTokenRequestConcurrencyControl sync,
2020
IUserTokenStore userAccessTokenStore,
2121
TimeProvider clock,
2222
IOptions<UserTokenManagementOptions> options,
23-
IUserTokenEndpointService tokenEndpointService,
24-
ILogger<UserAccessAccessTokenManagementService> logger) : IUserTokenManagementService
23+
IOpenIdConnectUserTokenClient tokenClient,
24+
ILogger<UserAccessAccessTokenManager> logger) : IUserTokenManager
2525
{
2626

2727
/// <inheritdoc/>
@@ -73,7 +73,7 @@ public async Task<TokenResult<UserToken>> GetAccessTokenAsync(
7373
key: requestedToken.RefreshToken,
7474
tokenRetriever: async () =>
7575
{
76-
var getRefreshedToken = await tokenEndpointService.RefreshAccessTokenAsync(
76+
var getRefreshedToken = await tokenClient.RefreshAccessTokenAsync(
7777
requestedToken.RefreshToken,
7878
parameters,
7979
cancellationToken).ConfigureAwait(false);
@@ -122,7 +122,7 @@ public async Task RevokeRefreshTokenAsync(
122122

123123
if (getToken.WasSuccessful(out var userToken) && userToken.RefreshToken != null)
124124
{
125-
await tokenEndpointService.RevokeRefreshTokenAsync(userToken.RefreshToken, parameters, cancellationToken).ConfigureAwait(false);
125+
await tokenClient.RevokeRefreshTokenAsync(userToken.RefreshToken, parameters, cancellationToken).ConfigureAwait(false);
126126
await userAccessTokenStore.ClearTokenAsync(user, parameters, cancellationToken).ConfigureAwait(false);
127127
}
128128
}

access-token-management/src/AccessTokenManagement.OpenIdConnect/OpenIdConnectClientConfiguration.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ namespace Duende.AccessTokenManagement.OpenIdConnect;
88
/// <summary>
99
/// Configuration setting sourced from the OpenID Connect handler
1010
/// </summary>
11-
public class OpenIdConnectClientConfiguration
11+
public sealed class OpenIdConnectClientConfiguration
1212
{
1313
///// <summary>
1414
///// The authority

access-token-management/src/AccessTokenManagement.OpenIdConnect/ServiceCollectionExtensions.cs

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
// Licensed under the Apache License, Version 2.0. See LICENSE in the project root for license information.
33

44
using Duende.AccessTokenManagement.OpenIdConnect.Internal;
5-
using Microsoft.AspNetCore.Http;
5+
using Microsoft.AspNetCore.Authentication;
66
using Microsoft.Extensions.DependencyInjection;
77
using Microsoft.Extensions.DependencyInjection.Extensions;
88
using Microsoft.Extensions.Options;
@@ -28,10 +28,10 @@ public static IServiceCollection AddOpenIdConnectAccessTokenManagement(this ISer
2828

2929
// TODO: maybe return a builder with a ConfigureScheme that adds IConfigureNamedOptions/IPostConfigureNamedOptions with the naming convention?
3030
// for example, per-scheme client credentials style, scope, etc settings
31-
services.TryAddTransient<IUserTokenManagementService, UserAccessAccessTokenManagementService>();
31+
services.TryAddTransient<IUserTokenManager, UserAccessAccessTokenManager>();
3232
services.TryAddTransient<IOpenIdConnectConfigurationService, OpenIdConnectConfigurationService>();
3333
services.TryAddSingleton<IUserTokenRequestConcurrencyControl, UserTokenRequestConcurrencyControl>();
34-
services.TryAddTransient<IUserTokenEndpointService, UserTokenEndpointService>();
34+
services.TryAddTransient<IOpenIdConnectUserTokenClient, OpenIdConnectUserTokenClient>();
3535
services.TryAddSingleton<IStoreTokensInAuthenticationProperties, StoreTokensInAuthenticationProperties>();
3636
services.ConfigureOptions<ConfigureOpenIdConnectOptions>();
3737

@@ -218,7 +218,7 @@ public static IHttpClientBuilder AddUserAccessTokenHandler(
218218
httpClientBuilder.AddHttpMessageHandler(provider =>
219219
{
220220
var httpContextAccessor = provider.GetRequiredService<IUserAccessor>();
221-
var userTokenManagementService = provider.GetRequiredService<IUserTokenManagementService>();
221+
var userTokenManagementService = provider.GetRequiredService<IUserTokenManager>();
222222

223223
var tokenRetriever = new OpenIdConnectUserAccessTokenRetriever(
224224
httpContextAccessor,
@@ -242,9 +242,13 @@ public static IHttpClientBuilder AddClientAccessTokenHandler(
242242
UserTokenRequestParameters? parameters = null) =>
243243
httpClientBuilder.AddHttpMessageHandler(provider =>
244244
{
245-
var httpContextAccessor = provider.GetRequiredService<IHttpContextAccessor>();
245+
var tokenManager = provider.GetRequiredService<IClientCredentialsTokenManager>();
246+
var schemeProvider = provider.GetRequiredService<IAuthenticationSchemeProvider>();
247+
var options = provider.GetRequiredService<IOptions<UserTokenManagementOptions>>();
246248

247-
var tokenRetriever = new OpenIdConnectClientAccessTokenRetriever(httpContextAccessor,
249+
var tokenRetriever = new OpenIdConnectClientAccessTokenRetriever(tokenManager,
250+
options,
251+
schemeProvider,
248252
parameters);
249253

250254
return provider.BuildAccessTokenRequestHandler(tokenRetriever);
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33

44
using System.Security.Claims;
55

6-
namespace Duende.AccessTokenManagement.OpenIdConnect.Internal;
6+
namespace Duende.AccessTokenManagement.OpenIdConnect;
77

88
/// <summary>
99
/// Allows transforming the principal before re-issuing the authentication session

access-token-management/src/AccessTokenManagement.OpenIdConnect/UserRefreshToken.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,8 @@
22
// Licensed under the Apache License, Version 2.0. See LICENSE in the project root for license information.
33

44

5+
using Duende.AccessTokenManagement.DPoP;
56

67
namespace Duende.AccessTokenManagement.OpenIdConnect;
78

8-
public record UserRefreshToken(RefreshTokenString RefreshToken, DPoPJsonWebKey? DPoPJsonWebKey);
9+
public sealed record UserRefreshToken(RefreshTokenString RefreshToken, DPoPJsonWebKey? DPoPJsonWebKey);

access-token-management/src/AccessTokenManagement.OpenIdConnect/UserToken.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
// Licensed under the Apache License, Version 2.0. See LICENSE in the project root for license information.
33

44

5+
using Duende.AccessTokenManagement.DPoP;
56

67
namespace Duende.AccessTokenManagement.OpenIdConnect;
78

access-token-management/src/AccessTokenManagement.OpenIdConnect/UserTokenManagementOptions.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,14 +2,15 @@
22
// Licensed under the Apache License, Version 2.0. See LICENSE in the project root for license information.
33

44

5+
using Duende.AccessTokenManagement.DPoP;
56
using Duende.IdentityModel.Client;
67

78
namespace Duende.AccessTokenManagement.OpenIdConnect;
89

910
/// <summary>
1011
/// Options for user access token management
1112
/// </summary>
12-
public class UserTokenManagementOptions
13+
public sealed class UserTokenManagementOptions
1314
{
1415
/// <summary>
1516
/// Name of the authentication scheme to use for deriving token service configuration

0 commit comments

Comments
 (0)