Skip to content

Commit ed583cb

Browse files
committed
Provide the ability to resolve the ITokenRequestCustomizer from DI
1 parent 5f74c36 commit ed583cb

File tree

5 files changed

+279
-16
lines changed

5 files changed

+279
-16
lines changed

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

Lines changed: 38 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -232,10 +232,27 @@ public static IHttpClientBuilder AddUserAccessTokenHandler(
232232
this IHttpClientBuilder httpClientBuilder,
233233
ITokenRequestCustomizer? tokenRequestCustomizer,
234234
UserTokenRequestParameters? parameters = null) =>
235-
httpClientBuilder.AddHttpMessageHandler(provider =>
235+
AddUserAccessTokenHandler(httpClientBuilder, _ => tokenRequestCustomizer, parameters);
236+
237+
/// <summary>
238+
/// Adds the user access token handler to an HttpClient
239+
/// </summary>
240+
/// <param name="httpClientBuilder"></param>
241+
/// <param name="tokenRequestCustomizerFactory"></param>
242+
/// <param name="parameters"></param>
243+
/// <returns></returns>
244+
public static IHttpClientBuilder AddUserAccessTokenHandler(
245+
this IHttpClientBuilder httpClientBuilder,
246+
Func<IServiceProvider, ITokenRequestCustomizer?> tokenRequestCustomizerFactory,
247+
UserTokenRequestParameters? parameters = null)
248+
{
249+
ArgumentNullException.ThrowIfNull(tokenRequestCustomizerFactory);
250+
251+
return httpClientBuilder.AddHttpMessageHandler(provider =>
236252
{
237253
var httpContextAccessor = provider.GetRequiredService<IUserAccessor>();
238254
var userTokenManagementService = provider.GetRequiredService<IUserTokenManager>();
255+
var tokenRequestCustomizer = tokenRequestCustomizerFactory(provider);
239256

240257
var tokenRetriever = new OpenIdConnectUserAccessTokenRetriever(
241258
httpContextAccessor,
@@ -244,9 +261,8 @@ public static IHttpClientBuilder AddUserAccessTokenHandler(
244261
tokenRequestCustomizer);
245262

246263
return provider.BuildAccessTokenRequestHandler(tokenRetriever);
247-
248-
#pragma warning restore CS0618 // Type or member is obsolete
249264
});
265+
}
250266

251267
/// <summary>
252268
/// Adds the client access token handler to an HttpClient
@@ -273,11 +289,28 @@ public static IHttpClientBuilder AddClientAccessTokenHandler(
273289
this IHttpClientBuilder httpClientBuilder,
274290
ITokenRequestCustomizer? tokenRequestCustomizer,
275291
UserTokenRequestParameters? parameters = null) =>
276-
httpClientBuilder.AddHttpMessageHandler(provider =>
292+
AddClientAccessTokenHandler(httpClientBuilder, _ => tokenRequestCustomizer, parameters);
293+
294+
/// <summary>
295+
/// Adds the client access token handler to an HttpClient
296+
/// </summary>
297+
/// <param name="httpClientBuilder"></param>
298+
/// <param name="tokenRequestCustomizerFactory"></param>
299+
/// <param name="parameters"></param>
300+
/// <returns></returns>
301+
public static IHttpClientBuilder AddClientAccessTokenHandler(
302+
this IHttpClientBuilder httpClientBuilder,
303+
Func<IServiceProvider, ITokenRequestCustomizer?> tokenRequestCustomizerFactory,
304+
UserTokenRequestParameters? parameters = null)
305+
{
306+
ArgumentNullException.ThrowIfNull(tokenRequestCustomizerFactory);
307+
308+
return httpClientBuilder.AddHttpMessageHandler(provider =>
277309
{
278310
var tokenManager = provider.GetRequiredService<IClientCredentialsTokenManager>();
279311
var schemeProvider = provider.GetRequiredService<IAuthenticationSchemeProvider>();
280312
var options = provider.GetRequiredService<IOptions<UserTokenManagementOptions>>();
313+
var tokenRequestCustomizer = tokenRequestCustomizerFactory(provider);
281314

282315
var tokenRetriever = new OpenIdConnectClientAccessTokenRetriever(tokenManager,
283316
options,
@@ -287,5 +320,5 @@ public static IHttpClientBuilder AddClientAccessTokenHandler(
287320

288321
return provider.BuildAccessTokenRequestHandler(tokenRetriever);
289322
});
290-
#pragma warning restore CS0618 // Type or member is obsolete
323+
}
291324
}

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

Lines changed: 29 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -152,16 +152,36 @@ public static IHttpClientBuilder AddClientCredentialsTokenHandler(
152152
public static IHttpClientBuilder AddClientCredentialsTokenHandler(
153153
this IHttpClientBuilder httpClientBuilder,
154154
ITokenRequestCustomizer? tokenRequestCustomizer,
155-
ClientCredentialsClientName clientName) => httpClientBuilder
156-
.AddHttpMessageHandler(provider =>
157-
{
158-
var accessTokenManagementService = provider.GetRequiredService<IClientCredentialsTokenManager>();
159-
var retriever =
160-
new ClientCredentialsTokenRetriever(accessTokenManagementService, clientName, tokenRequestCustomizer);
161-
var accessTokenHandler = provider.BuildAccessTokenRequestHandler(retriever);
155+
ClientCredentialsClientName clientName) =>
156+
AddClientCredentialsTokenHandler(httpClientBuilder, _ => tokenRequestCustomizer, clientName);
162157

163-
return accessTokenHandler;
164-
});
158+
/// <summary>
159+
/// Adds the client access token handler to an HttpClient
160+
/// </summary>
161+
/// <param name="httpClientBuilder"></param>
162+
/// <param name="tokenRequestCustomizerFactory"></param>
163+
/// <param name="clientName"></param>
164+
/// <returns></returns>
165+
public static IHttpClientBuilder AddClientCredentialsTokenHandler(
166+
this IHttpClientBuilder httpClientBuilder,
167+
Func<IServiceProvider, ITokenRequestCustomizer?> tokenRequestCustomizerFactory,
168+
ClientCredentialsClientName clientName)
169+
{
170+
ArgumentNullException.ThrowIfNull(tokenRequestCustomizerFactory);
171+
172+
return httpClientBuilder
173+
.AddHttpMessageHandler(provider =>
174+
{
175+
var accessTokenManagementService = provider.GetRequiredService<IClientCredentialsTokenManager>();
176+
var tokenRequestCustomizer = tokenRequestCustomizerFactory(provider);
177+
var retriever =
178+
new ClientCredentialsTokenRetriever(accessTokenManagementService, clientName,
179+
tokenRequestCustomizer);
180+
var accessTokenHandler = provider.BuildAccessTokenRequestHandler(retriever);
181+
182+
return accessTokenHandler;
183+
});
184+
}
165185

166186
internal static AccessTokenRequestHandler BuildAccessTokenRequestHandler(
167187
this IServiceProvider provider,

access-token-management/test/AccessTokenManagement.Tests/PublicApiVerificationTests.VerifyPublicApi.verified.txt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -220,6 +220,7 @@
220220
public static Microsoft.Extensions.DependencyInjection.IHttpClientBuilder AddClientCredentialsHttpClient(this Microsoft.Extensions.DependencyInjection.IServiceCollection services, string httpClientName, Duende.AccessTokenManagement.ClientCredentialsClientName clientName, System.Action<System.IServiceProvider, System.Net.Http.HttpClient> configureClient) { }
221221
public static Microsoft.Extensions.DependencyInjection.IHttpClientBuilder AddClientCredentialsTokenHandler(this Microsoft.Extensions.DependencyInjection.IHttpClientBuilder httpClientBuilder, Duende.AccessTokenManagement.ClientCredentialsClientName clientName) { }
222222
public static Microsoft.Extensions.DependencyInjection.IHttpClientBuilder AddClientCredentialsTokenHandler(this Microsoft.Extensions.DependencyInjection.IHttpClientBuilder httpClientBuilder, Duende.AccessTokenManagement.ITokenRequestCustomizer? tokenRequestCustomizer, Duende.AccessTokenManagement.ClientCredentialsClientName clientName) { }
223+
public static Microsoft.Extensions.DependencyInjection.IHttpClientBuilder AddClientCredentialsTokenHandler(this Microsoft.Extensions.DependencyInjection.IHttpClientBuilder httpClientBuilder, System.Func<System.IServiceProvider, Duende.AccessTokenManagement.ITokenRequestCustomizer?> customizerFactory, Duende.AccessTokenManagement.ClientCredentialsClientName clientName) { }
223224
public static Duende.AccessTokenManagement.ClientCredentialsTokenManagementBuilder AddClientCredentialsTokenManagement(this Microsoft.Extensions.DependencyInjection.IServiceCollection services) { }
224225
public static Duende.AccessTokenManagement.ClientCredentialsTokenManagementBuilder AddClientCredentialsTokenManagement(this Microsoft.Extensions.DependencyInjection.IServiceCollection services, System.Action<Duende.AccessTokenManagement.ClientCredentialsTokenManagementOptions> options) { }
225226
public static Microsoft.Extensions.DependencyInjection.IHttpClientBuilder AddDefaultAccessTokenResiliency(this Microsoft.Extensions.DependencyInjection.IHttpClientBuilder httpClientBuilder) { }
@@ -386,4 +387,4 @@ namespace Duende.AccessTokenManagement.OTel
386387
{
387388
public static System.Diagnostics.ActivitySource Main;
388389
}
389-
}
390+
}

access-token-management/test/AccessTokenManagement.Tests/PublicApiVerificationTests.VerifyPublicApi_OpenIdConnect.verified.txt

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -62,13 +62,15 @@
6262
where TTokenStore : class, Duende.AccessTokenManagement.OpenIdConnect.IUserTokenStore { }
6363
public static Microsoft.Extensions.DependencyInjection.IHttpClientBuilder AddClientAccessTokenHandler(this Microsoft.Extensions.DependencyInjection.IHttpClientBuilder httpClientBuilder, Duende.AccessTokenManagement.OpenIdConnect.UserTokenRequestParameters? parameters = null) { }
6464
public static Microsoft.Extensions.DependencyInjection.IHttpClientBuilder AddClientAccessTokenHandler(this Microsoft.Extensions.DependencyInjection.IHttpClientBuilder httpClientBuilder, Duende.AccessTokenManagement.ITokenRequestCustomizer? tokenRequestCustomizer, Duende.AccessTokenManagement.OpenIdConnect.UserTokenRequestParameters? parameters = null) { }
65+
public static Microsoft.Extensions.DependencyInjection.IHttpClientBuilder AddClientAccessTokenHandler(this Microsoft.Extensions.DependencyInjection.IHttpClientBuilder httpClientBuilder, System.Func<System.IServiceProvider, Duende.AccessTokenManagement.ITokenRequestCustomizer?> customizerFactory, Duende.AccessTokenManagement.OpenIdConnect.UserTokenRequestParameters? parameters = null) { }
6566
public static Microsoft.Extensions.DependencyInjection.IHttpClientBuilder AddClientAccessTokenHttpClient(this Microsoft.Extensions.DependencyInjection.IServiceCollection services, string name, Duende.AccessTokenManagement.OpenIdConnect.UserTokenRequestParameters? parameters = null, System.Action<System.Net.Http.HttpClient>? configureClient = null) { }
6667
public static Microsoft.Extensions.DependencyInjection.IHttpClientBuilder AddClientAccessTokenHttpClient<T>(this Microsoft.Extensions.DependencyInjection.IServiceCollection services, Duende.AccessTokenManagement.OpenIdConnect.UserTokenRequestParameters? parameters = null, System.Action<System.Net.Http.HttpClient>? configureClient = null)
6768
where T : class { }
6869
public static Microsoft.Extensions.DependencyInjection.IServiceCollection AddOpenIdConnectAccessTokenManagement(this Microsoft.Extensions.DependencyInjection.IServiceCollection services) { }
6970
public static Microsoft.Extensions.DependencyInjection.IServiceCollection AddOpenIdConnectAccessTokenManagement(this Microsoft.Extensions.DependencyInjection.IServiceCollection services, System.Action<Duende.AccessTokenManagement.OpenIdConnect.UserTokenManagementOptions> configureAction) { }
7071
public static Microsoft.Extensions.DependencyInjection.IHttpClientBuilder AddUserAccessTokenHandler(this Microsoft.Extensions.DependencyInjection.IHttpClientBuilder httpClientBuilder, Duende.AccessTokenManagement.OpenIdConnect.UserTokenRequestParameters? parameters = null) { }
7172
public static Microsoft.Extensions.DependencyInjection.IHttpClientBuilder AddUserAccessTokenHandler(this Microsoft.Extensions.DependencyInjection.IHttpClientBuilder httpClientBuilder, Duende.AccessTokenManagement.ITokenRequestCustomizer? tokenRequestCustomizer, Duende.AccessTokenManagement.OpenIdConnect.UserTokenRequestParameters? parameters = null) { }
73+
public static Microsoft.Extensions.DependencyInjection.IHttpClientBuilder AddUserAccessTokenHandler(this Microsoft.Extensions.DependencyInjection.IHttpClientBuilder httpClientBuilder, System.Func<System.IServiceProvider, Duende.AccessTokenManagement.ITokenRequestCustomizer?> customizerFactory, Duende.AccessTokenManagement.OpenIdConnect.UserTokenRequestParameters? parameters = null) { }
7274
public static Microsoft.Extensions.DependencyInjection.IHttpClientBuilder AddUserAccessTokenHttpClient(this Microsoft.Extensions.DependencyInjection.IServiceCollection services, string name, Duende.AccessTokenManagement.OpenIdConnect.UserTokenRequestParameters? parameters = null, System.Action<System.Net.Http.HttpClient>? configureClient = null) { }
7375
public static Microsoft.Extensions.DependencyInjection.IHttpClientBuilder AddUserAccessTokenHttpClient(this Microsoft.Extensions.DependencyInjection.IServiceCollection services, string name, Duende.AccessTokenManagement.OpenIdConnect.UserTokenRequestParameters? parameters = null, System.Action<System.IServiceProvider, System.Net.Http.HttpClient>? configureClient = null) { }
7476
public static Microsoft.Extensions.DependencyInjection.IHttpClientBuilder AddUserAccessTokenHttpClient<T>(this Microsoft.Extensions.DependencyInjection.IServiceCollection services, Duende.AccessTokenManagement.OpenIdConnect.UserTokenRequestParameters? parameters = null, System.Action<System.IServiceProvider, System.Net.Http.HttpClient>? configureClient = null)
@@ -124,4 +126,4 @@
124126
public Duende.AccessTokenManagement.Scheme? ChallengeScheme { get; set; }
125127
public Duende.AccessTokenManagement.Scheme? SignInScheme { get; set; }
126128
}
127-
}
129+
}

0 commit comments

Comments
 (0)