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

Blazor WASM独立项目无法将Keycloak的JWT传递至.NET API

解决Blazor WASM独立应用向API传递JWT令牌的问题

核心原因澄清

独立Blazor WASM的认证系统不会自动为所有请求附加令牌,仅针对以下场景自动添加:

  • 请求目标域名在appsettings.json的AllowedHosts列表内
  • 通过AddHttpClient配置的命名客户端显式指定了令牌附加策略
  • 请求URI匹配AccessTokenOptions中配置的作用域对应资源

你提到的"BaseUri"是WASM自身应用的基础路径(比如部署后的根路径),和API地址无关,修改它无法解决令牌传递问题。

具体解决方案

方案1:配置AllowedHosts允许API域名

在WASM项目的appsettings.json中,将API的域名加入AllowedHosts:

{
  "AllowedHosts": "https://your-api-domain.com, https://localhost:5001"
}

这会让认证系统自动为发往这些域名的请求附加Bearer令牌。

方案2:创建带令牌附加策略的命名HttpClient

在WASM的Program.cs中,配置专门用于调用API的命名HttpClient,显式绑定认证令牌:

builder.Services.AddHttpClient("ApiClient", client =>
{
    client.BaseAddress = new Uri("https://your-api-domain.com/");
})
.AddHttpMessageHandler<BaseAddressAuthorizationMessageHandler>();

// 注册可注入的HttpClient实例
builder.Services.AddScoped(sp => 
    sp.GetRequiredService<IHttpClientFactory>().CreateClient("ApiClient"));

在组件中注入该命名HttpClient调用API:

@inject HttpClient ApiClient

private async Task CallApi()
{
    var response = await ApiClient.GetAsync("api/your-endpoint");
    // 处理响应逻辑
}

BaseAddressAuthorizationMessageHandler会自动为该客户端的请求附加有效JWT令牌。

方案3:手动指定令牌附加的资源范围

若需更精细控制,可在Program.cs中配置AccessTokenOptions,指定API对应的资源或作用域:

builder.Services.AddOidcAuthentication(options =>
{
    options.ProviderOptions.Authority = "https://your-keycloak-domain/auth/realms/your-realm";
    options.ProviderOptions.ClientId = "your-client-id";
    // 添加API的资源标识符或作用域
    options.UserOptions.Scope.Add("api-resource-name");
});

同时确保Keycloak客户端已配置该API资源的访问权限。

验证步骤

配置完成后用Fiddler抓包确认:

  • 请求头包含Authorization: Bearer {token}
  • 令牌的aud(受众)字段包含API的资源标识符
  • API服务器的认证配置正确(已配置Keycloak JWKS端点验证令牌)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 07:52:37