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

Blazor 6.0 Server页面无数据,请求报401未授权错误求助

Blazor Server调用API出现401(Unauthorized)问题排查与解决

核心原因分析

你直接访问/api/InvalidAddressMapping能获取到数据,但Blazor页面调用时报401,说明API本身业务逻辑正常,问题出在Blazor Server发起请求时的身份凭据传递或API授权配置与Blazor身份上下文不匹配。

具体解决方案

1. 检查API控制器的授权配置

如果控制器添加了[Authorize]特性,但Blazor Server页面未登录或无有效身份上下文,就会触发未授权错误。

  • 若API无需授权,直接添加[AllowAnonymous]允许匿名访问:
    [ApiController]
    [Route("api/[controller]")]
    [AllowAnonymous]
    public class InvalidAddressMappingController : ControllerBase
    {
        // 你的控制器逻辑代码
    }
    
  • 若API需要授权,确保Blazor Server已配置身份验证(如Cookie认证),且当前用户已登录,同时API的授权策略与Blazor Server保持一致。

2. 配置HttpClient自动携带用户凭据

Blazor Server默认的HttpClient不会自动携带当前用户的身份令牌,需手动配置消息处理器:
在Program.cs中注册HttpClient时,添加BaseAddressAuthorizationMessageHandler:

builder.Services.AddHttpClient("ApiClient", client =>
{
    client.BaseAddress = new Uri(builder.HostEnvironment.BaseAddress);
})
.AddHttpMessageHandler<BaseAddressAuthorizationMessageHandler>();

// 注入配置好的命名HttpClient
builder.Services.AddScoped(sp => sp.GetRequiredService<IHttpClientFactory>().CreateClient("ApiClient"));

随后在Razor页面中注入该命名HttpClient,替代默认HttpClient:

@inject HttpClient ApiClient

@code {
    private List<InvalidAddressMapping> mappingData;

    protected override async Task OnInitializedAsync()
    {
        mappingData = await ApiClient.GetFromJsonAsync<List<InvalidAddressMapping>>("api/InvalidAddressMapping");
    }
}

3. 排查CORS配置(跨域场景)

若Blazor Server与API部署在不同域名下,即便直接访问API正常,页面发起请求也可能因CORS配置缺失导致401(部分场景下CORS错误会伪装成未授权)。
在API的Program.cs中配置CORS:

builder.Services.AddCors(options =>
{
    options.AddPolicy("AllowBlazorOrigin",
        policy => policy.WithOrigins(builder.HostEnvironment.BaseAddress)
                        .AllowAnyHeader()
                        .AllowAnyMethod()
                        .AllowCredentials());
});

// 注意中间件顺序:放在UseRouting之后,UseAuthorization之前
app.UseCors("AllowBlazorOrigin");

4. 确保身份验证方案一致

如果Blazor Server使用Cookie认证,API也必须配置相同的认证方案,否则凭据无法被API认可:
在API的Program.cs中添加Cookie认证:

builder.Services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme)
    .AddCookie();

// 中间件顺序:先执行UseAuthentication,再执行UseAuthorization
app.UseAuthentication();
app.UseAuthorization();

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 22:09:23