Skip to content

Commit 8c2528a

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

File tree

5 files changed

+267
-25
lines changed

5 files changed

+267
-25
lines changed

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

Lines changed: 52 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -216,9 +216,9 @@ public static IHttpClientBuilder AddClientAccessTokenHttpClient(this IServiceCol
216216
/// <returns></returns>
217217
public static IHttpClientBuilder AddUserAccessTokenHandler(
218218
this IHttpClientBuilder httpClientBuilder,
219-
UserTokenRequestParameters? parameters = null) => AddUserAccessTokenHandler(
219+
UserTokenRequestParameters? parameters = null) => AddUserAccessTokenHandlerInternal(
220220
httpClientBuilder,
221-
tokenRequestCustomizer: null,
221+
tokenRequestCustomizerFactory: null,
222222
parameters);
223223

224224
/// <summary>
@@ -230,12 +230,35 @@ public static IHttpClientBuilder AddUserAccessTokenHandler(
230230
/// <returns></returns>
231231
public static IHttpClientBuilder AddUserAccessTokenHandler(
232232
this IHttpClientBuilder httpClientBuilder,
233-
ITokenRequestCustomizer? tokenRequestCustomizer,
233+
ITokenRequestCustomizer tokenRequestCustomizer,
234234
UserTokenRequestParameters? parameters = null) =>
235+
AddUserAccessTokenHandlerInternal(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+
return AddUserAccessTokenHandlerInternal(httpClientBuilder, tokenRequestCustomizerFactory, parameters);
251+
}
252+
253+
private static IHttpClientBuilder AddUserAccessTokenHandlerInternal(
254+
IHttpClientBuilder httpClientBuilder,
255+
Func<IServiceProvider, ITokenRequestCustomizer>? tokenRequestCustomizerFactory,
256+
UserTokenRequestParameters? parameters) =>
235257
httpClientBuilder.AddHttpMessageHandler(provider =>
236258
{
237259
var httpContextAccessor = provider.GetRequiredService<IUserAccessor>();
238260
var userTokenManagementService = provider.GetRequiredService<IUserTokenManager>();
261+
var tokenRequestCustomizer = tokenRequestCustomizerFactory?.Invoke(provider);
239262

240263
var tokenRetriever = new OpenIdConnectUserAccessTokenRetriever(
241264
httpContextAccessor,
@@ -244,8 +267,6 @@ public static IHttpClientBuilder AddUserAccessTokenHandler(
244267
tokenRequestCustomizer);
245268

246269
return provider.BuildAccessTokenRequestHandler(tokenRetriever);
247-
248-
#pragma warning restore CS0618 // Type or member is obsolete
249270
});
250271

251272
/// <summary>
@@ -257,9 +278,9 @@ public static IHttpClientBuilder AddUserAccessTokenHandler(
257278
public static IHttpClientBuilder AddClientAccessTokenHandler(
258279
this IHttpClientBuilder httpClientBuilder,
259280
UserTokenRequestParameters? parameters = null) =>
260-
AddClientAccessTokenHandler(
281+
AddClientAccessTokenHandlerInternal(
261282
httpClientBuilder,
262-
tokenRequestCustomizer: null,
283+
tokenRequestCustomizerFactory: null,
263284
parameters);
264285

265286
/// <summary>
@@ -271,13 +292,36 @@ public static IHttpClientBuilder AddClientAccessTokenHandler(
271292
/// <returns></returns>
272293
public static IHttpClientBuilder AddClientAccessTokenHandler(
273294
this IHttpClientBuilder httpClientBuilder,
274-
ITokenRequestCustomizer? tokenRequestCustomizer,
295+
ITokenRequestCustomizer tokenRequestCustomizer,
275296
UserTokenRequestParameters? parameters = null) =>
297+
AddClientAccessTokenHandlerInternal(httpClientBuilder, _ => tokenRequestCustomizer, parameters);
298+
299+
/// <summary>
300+
/// Adds the client access token handler to an HttpClient
301+
/// </summary>
302+
/// <param name="httpClientBuilder"></param>
303+
/// <param name="tokenRequestCustomizerFactory"></param>
304+
/// <param name="parameters"></param>
305+
/// <returns></returns>
306+
public static IHttpClientBuilder AddClientAccessTokenHandler(
307+
this IHttpClientBuilder httpClientBuilder,
308+
Func<IServiceProvider, ITokenRequestCustomizer> tokenRequestCustomizerFactory,
309+
UserTokenRequestParameters? parameters = null)
310+
{
311+
ArgumentNullException.ThrowIfNull(tokenRequestCustomizerFactory);
312+
return AddClientAccessTokenHandlerInternal(httpClientBuilder, tokenRequestCustomizerFactory, parameters);
313+
}
314+
315+
private static IHttpClientBuilder AddClientAccessTokenHandlerInternal(
316+
IHttpClientBuilder httpClientBuilder,
317+
Func<IServiceProvider, ITokenRequestCustomizer>? tokenRequestCustomizerFactory,
318+
UserTokenRequestParameters? parameters) =>
276319
httpClientBuilder.AddHttpMessageHandler(provider =>
277320
{
278321
var tokenManager = provider.GetRequiredService<IClientCredentialsTokenManager>();
279322
var schemeProvider = provider.GetRequiredService<IAuthenticationSchemeProvider>();
280323
var options = provider.GetRequiredService<IOptions<UserTokenManagementOptions>>();
324+
var tokenRequestCustomizer = tokenRequestCustomizerFactory?.Invoke(provider);
281325

282326
var tokenRetriever = new OpenIdConnectClientAccessTokenRetriever(tokenManager,
283327
options,
@@ -287,5 +331,4 @@ public static IHttpClientBuilder AddClientAccessTokenHandler(
287331

288332
return provider.BuildAccessTokenRequestHandler(tokenRetriever);
289333
});
290-
#pragma warning restore CS0618 // Type or member is obsolete
291334
}

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

Lines changed: 39 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -137,10 +137,8 @@ public static IHttpClientBuilder AddDefaultAccessTokenResiliency(this IHttpClien
137137
/// <returns></returns>
138138
public static IHttpClientBuilder AddClientCredentialsTokenHandler(
139139
this IHttpClientBuilder httpClientBuilder,
140-
ClientCredentialsClientName clientName) => AddClientCredentialsTokenHandler(
141-
httpClientBuilder,
142-
tokenRequestCustomizer: null,
143-
clientName);
140+
ClientCredentialsClientName clientName) =>
141+
AddClientCredentialsTokenHandlerInternal(httpClientBuilder, tokenRequestCustomizerFactory: null, clientName);
144142

145143
/// <summary>
146144
/// Adds the client access token handler to an HttpClient
@@ -151,17 +149,44 @@ public static IHttpClientBuilder AddClientCredentialsTokenHandler(
151149
/// <returns></returns>
152150
public static IHttpClientBuilder AddClientCredentialsTokenHandler(
153151
this IHttpClientBuilder httpClientBuilder,
154-
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);
152+
ITokenRequestCustomizer tokenRequestCustomizer,
153+
ClientCredentialsClientName clientName)
154+
{
155+
ArgumentNullException.ThrowIfNull(tokenRequestCustomizer);
156+
return AddClientCredentialsTokenHandlerInternal(httpClientBuilder, _ => tokenRequestCustomizer, clientName);
157+
}
158+
159+
/// <summary>
160+
/// Adds the client access token handler to an HttpClient
161+
/// </summary>
162+
/// <param name="httpClientBuilder"></param>
163+
/// <param name="tokenRequestCustomizerFactory"></param>
164+
/// <param name="clientName"></param>
165+
/// <returns></returns>
166+
public static IHttpClientBuilder AddClientCredentialsTokenHandler(
167+
this IHttpClientBuilder httpClientBuilder,
168+
Func<IServiceProvider, ITokenRequestCustomizer> tokenRequestCustomizerFactory,
169+
ClientCredentialsClientName clientName)
170+
{
171+
ArgumentNullException.ThrowIfNull(tokenRequestCustomizerFactory);
172+
return AddClientCredentialsTokenHandlerInternal(httpClientBuilder, tokenRequestCustomizerFactory, clientName);
173+
}
162174

163-
return accessTokenHandler;
164-
});
175+
private static IHttpClientBuilder AddClientCredentialsTokenHandlerInternal(
176+
IHttpClientBuilder httpClientBuilder,
177+
Func<IServiceProvider, ITokenRequestCustomizer>? tokenRequestCustomizerFactory,
178+
ClientCredentialsClientName clientName) => httpClientBuilder
179+
.AddHttpMessageHandler(provider =>
180+
{
181+
var accessTokenManagementService = provider.GetRequiredService<IClientCredentialsTokenManager>();
182+
var tokenRequestCustomizer = tokenRequestCustomizerFactory?.Invoke(provider);
183+
var retriever =
184+
new ClientCredentialsTokenRetriever(accessTokenManagementService, clientName,
185+
tokenRequestCustomizer);
186+
var accessTokenHandler = provider.BuildAccessTokenRequestHandler(retriever);
187+
188+
return accessTokenHandler;
189+
});
165190

166191
internal static AccessTokenRequestHandler BuildAccessTokenRequestHandler(
167192
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)