确保 BaseAddressAuthorizationMessageHandler 附加访问令牌

问题描述 投票:0回答:1

在我的 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 也正确。

c# asp.net-core blazor blazor-webassembly dotnet-httpclient
1个回答
0
投票

拦截

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

© www.soinside.com 2019 - 2024. All rights reserved.