You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Blazor WASM发送带JWT Token的授权GET请求返回401问题

Blazor WASM 发送授权GET请求返回401的解决方案

核心问题:请求头格式错误

你当前代码中添加请求头的方式不符合HTTP Bearer授权规范,标准的授权头格式为:

Authorization: Bearer {你的Token值}

而你的代码错误地将Header名称设为Bearer,正确写法如下:

protected override async Task OnInitializedAsync(){
    string authToken = await LocalStorage.GetItemAsStringAsync("authToken");
    // 先移除已存在的Authorization头,避免重复添加抛出异常
    if (Http.DefaultRequestHeaders.Contains("Authorization"))
    {
        Http.DefaultRequestHeaders.Remove("Authorization");
    }
    // 正确构造授权头
    Http.DefaultRequestHeaders.Add("Authorization", $"Bearer {authToken}");
    var result = await Http.GetFromJsonAsync<ApplicationDto[]>("api/Applications");
}

更优的全局配置方案

如果多个页面都需要发送带授权的请求,建议通过DelegatingHandler全局配置HttpClient,避免重复编写添加头的逻辑:

  1. 创建自定义授权请求处理器:
public class AuthHeaderHandler : DelegatingHandler
{
    private readonly ILocalStorageService _localStorage;

    public AuthHeaderHandler(ILocalStorageService localStorage)
    {
        _localStorage = localStorage;
    }

    protected override async Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
    {
        var authToken = await _localStorage.GetItemAsStringAsync("authToken");
        if (!string.IsNullOrEmpty(authToken))
        {
            request.Headers.Authorization = new System.Net.Http.Headers.AuthenticationHeaderValue("Bearer", authToken);
        }
        return await base.SendAsync(request, cancellationToken);
    }
}
  1. 在Program.cs中注册处理器并配置HttpClient:
var builder = WebAssemblyHostBuilder.CreateDefault(args);
builder.RootComponents.Add<App>("#app");
builder.RootComponents.Add<HeadOutlet>("head::after");

builder.Services.AddBlazoredLocalStorage();
// 注册自定义授权处理器
builder.Services.AddScoped<AuthHeaderHandler>();
// 注册带授权逻辑的命名HttpClient
builder.Services.AddHttpClient("ApiClient", client =>
{
    client.BaseAddress = new Uri(builder.HostEnvironment.BaseAddress);
})
.AddHttpMessageHandler<AuthHeaderHandler>();

builder.Services.AddOptions();
builder.Services.AddAuthorizationCore();
builder.Services.AddScoped<AuthenticationStateProvider, PortalAuthStateProvider>();
builder.Services.AddMudServices();

await builder.Build().RunAsync();
  1. 在页面中注入并使用命名HttpClient:
@inject IHttpClientFactory HttpClientFactory

protected override async Task OnInitializedAsync(){
    var httpClient = HttpClientFactory.CreateClient("ApiClient");
    var result = await httpClient.GetFromJsonAsync<ApplicationDto[]>("api/Applications");
}

额外排查点

  • 确认Token未过期,且与Postman中使用的内容完全一致(注意不要包含多余空格或换行)
  • 检查API端JWT验证配置(如Issuer、Audience、密钥),确保与生成Token的配置完全匹配

内容的提问来源于stack exchange,提问作者Dsg951

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 20:05:33