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

Blazor WASM向外部ASP.NET Core API转发AAD认证遇401问题求助

解决方案:Blazor WASM独立应用向ASP.NET Core API转发AAD认证

你的401错误核心原因是客户端未获取到针对目标API的有效访问令牌、令牌未正确附加到请求,或服务端配置存在疏漏,以下是具体修复步骤:

1. 配置客户端获取API访问令牌

独立Blazor WASM默认仅获取自身的ID令牌,调用外部API需显式指定API的权限范围:

  • 修改客户端appsettings.json,添加API的作用域:
"AzureAd": {
  "Authority": "https://login.microsoftonline.com/common",
  "ClientId": "***",
  "ValidateAuthority": true,
  "Scopes": [
    "api://{你的API客户端ID}/access_as_user"
  ]
}
  • 或在Program.cs的AddMsalAuthentication中配置:
builder.Services.AddMsalAuthentication(options =>
{
    builder.Configuration.Bind("AzureAd", options.ProviderOptions.Authentication);
    // 添加API权限范围
    options.ProviderOptions.DefaultAccessTokenScopes.Add("api://{你的API客户端ID}/access_as_user");
});

2. 修正HTTP客户端的令牌附加逻辑

BaseAddressAuthorizationMessageHandler仅对与当前WASM应用BaseAddress匹配的请求附加令牌,需改用AuthorizationMessageHandler显式指定目标API地址:

services.AddHttpClient("LoginAPI", client => 
    client.BaseAddress = new Uri("https://localhost:7215"))
.AddHttpMessageHandler(sp =>
{
    var handler = sp.GetRequiredService<AuthorizationMessageHandler>()
        .ConfigureHandler(
            // 指定需要附加令牌的API地址
            authorizedUrls: new[] { "https://localhost:7215" },
            // 指定API的权限范围
            scopes: new[] { "api://{你的API客户端ID}/access_as_user" });
    return handler;
});

services.AddScoped(sp => sp.GetRequiredService<IHttpClientFactory>().CreateClient("LoginAPI"));

3. 修正服务端AAD配置

服务端TenantId使用common可能导致令牌验证失败,需替换为具体的租户ID(如组织租户ID):

"AzureAd": {
  "Instance": "https://login.microsoftonline.com/",
  "TenantId": "你的实际租户ID", // 格式:xxxxxx-xxxx-xxxx-xxxx-xxxxxxxxx
  "ClientId": "API的客户端ID"
}

4. 检查AAD应用注册配置

  • 客户端应用(Blazor WASM):在AAD门户中,添加API权限(选择你的API应用,添加access_as_user或自定义范围),并点击「授予管理员同意」(租户内应用需此操作)。
  • API应用:在AAD门户的「公开API」中确认已定义权限范围,且「授权的客户端应用」列表中添加了Blazor WASM的客户端ID。

5. 验证令牌有效性

用JWT解析工具检查客户端获取的访问令牌:

  • aud(受众)需匹配API的客户端ID或api://{API客户端ID}
  • scp(作用域)需包含你配置的API权限范围
  • iss(颁发者)需与服务端Instance+TenantId一致

6. 确认服务端中间件顺序

确保Program.cs中中间件顺序正确:

app.UseHttpsRedirection();
app.UseRouting();
app.UseAuthentication(); // 必须在UseAuthorization之前
app.UseAuthorization();

app.MapControllers();

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 21:55:45