如何在Blazor WASM中用IHttpClientFactory为Auth0远程API添加令牌
解决Blazor WASM中远程API请求无法附加Auth0令牌的问题
问题根源
BaseAddressAuthorizationMessageHandler的默认逻辑是仅当请求目标地址与Blazor应用的BaseAddress完全匹配时,才会自动附加访问令牌。你的远程API地址(https://localhost:7083/)与应用自身地址不同,因此不会触发令牌附加逻辑。
解决方案一:扩展原生Handler的授权地址列表
不需要自定义Handler,直接修改BaseAddressAuthorizationMessageHandler的配置,添加远程API地址到授权列表:
builder.Services.AddHttpClient("ServerAPI", client => client.BaseAddress = new Uri("https://localhost:7083/")) .AddHttpMessageHandler(sp => { var handler = sp.GetRequiredService<BaseAddressAuthorizationMessageHandler>(); // 将远程API地址加入授权地址列表 handler.AdditionalAuthorizedAddresses.Add("https://localhost:7083/"); return handler; }); builder.Services.AddScoped(sp => sp.GetRequiredService<IHttpClientFactory>().CreateClient("ServerAPI"));
这种方式利用原生Handler的扩展能力,保持代码简洁,适合仅需要添加额外授权地址的场景。
解决方案二:自定义HttpMessageHandler
如果需要更灵活的令牌附加逻辑(比如针对特定路径、自定义令牌获取规则),可以实现自定义的DelegatingHandler:
1. 定义自定义Handler
public class CustomAuthorizationMessageHandler : DelegatingHandler { private readonly IAccessTokenProvider _accessTokenProvider; public CustomAuthorizationMessageHandler(IAccessTokenProvider accessTokenProvider) { _accessTokenProvider = accessTokenProvider; } protected override async Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken) { // 从Auth0获取访问令牌 var tokenResult = await _accessTokenProvider.RequestAccessToken(); if (tokenResult.TryGetToken(out var token)) { // 将Bearer令牌附加到请求头 request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", token.Value); } return await base.SendAsync(request, cancellationToken); } }
2. 在Program.cs中注册
// 注册自定义Handler为Scoped服务 builder.Services.AddScoped<CustomAuthorizationMessageHandler>(); builder.Services.AddHttpClient("ServerAPI", client => client.BaseAddress = new Uri("https://localhost:7083/")) .AddHttpMessageHandler<CustomAuthorizationMessageHandler>(); builder.Services.AddScoped(sp => sp.GetRequiredService<IHttpClientFactory>().CreateClient("ServerAPI"));
这种方式完全由你控制令牌的获取和附加逻辑,适合复杂场景。
内容的提问来源于stack exchange,提问作者jon.r
相关产品推荐
相关产品推荐

