在我的 Blazor WASM 应用程序中,当我使用以下代码调用后端 API 时,我会收到
401 -Unauthorized
状态代码。如何检查以确保有效的 access_token
附加到我的 API 调用?
这是
Program.cs
代码:
builder.Services.AddHttpClient("MyApiClient",
client => client.BaseAddress = new Uri("https://api.test.com"))
.AddHttpMessageHandler<BaseAddressAuthorizationMessageHandler>();
builder.Services.AddScoped(sp => sp.GetRequiredService<IHttpClientFactory>()
.CreateClient("MyApiClient"));
在我的服务中,我使用以下代码进行 API 调用:
public async Task<User> GetUser()
{
// Set URL
var url = "/account/info";
var user = await GetAsync<User>(url);
return user;
}
private async Task<T> GetAsync<T>(string url)
{
if (string.IsNullOrWhiteSpace(url))
return default;
using (var client = _httpClientFactory.CreateClient("MyApiClient"))
{
var result = await client.GetAsync(url);
if (!result.IsSuccessStatusCode)
throw new Exception("My API GET call failed. URL: " + url);
var json = await result.Content.ReadAsStringAsync();
return JsonSerializer.Deserialize<T>(json);
}
}
您是否看到任何与此不符的地方?如果没有,我如何确保有效的
access_token
附加到我的 API 调用?
附注我看到
HttpClient
已正确创建,并且在我收到的错误消息中 BaseAddress
是正确的。该错误消息是标准的未经授权的访问错误。我在错误消息中没有看到任何其他数据,除了 url
绝对是正确的。
我还想提一下,我通过 Azure AD B2C 处理身份管理和访问令牌。该设置似乎是正确的,因为用户能够正常登录,并且用户的 ID 也正确。
拦截
HttpRequestMessage
的最简单方法是在您的 DelegateHandler
中添加另一个 HttpClient
。像这样的东西
public class RequestHeaderLoggerHandler(ILogger<RequestHeaderLoggerHandler> logger)
: DelegatingHandler
{
protected override async Task<HttpResponseMessage> SendAsync(
HttpRequestMessage request,
CancellationToken cancellationToken)
{
try
{
logger.LogInformation(request.Headers);
return await base.SendAsync(request, cancellationToken);
}
catch (Exception e)
{
logger.LogError(e);
throw;
}
}
}
以及用法
builder.Services.AddTransient<RequestHeaderLoggerHandler>();
builder.Services.AddHttpClient("MyApiClient",
client => client.BaseAddress = new Uri("https://api.test.com"))
.AddHttpMessageHandler<RequestHeaderLoggerHandler>()
.AddHttpMessageHandler<BaseAddressAuthorizationMessageHandler>();
我还没有运行过这段代码,所以我不能100%确定注册顺序是正确的,也许你需要先注册
BaseAddressAuthorizationMessageHandler
,然后RequestHeaderLoggerHandler
。