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

Blazor WebAssembly调用Http.sys托管且启用Windows身份验证的API返回未授权问题

解决Blazor WebAssembly跨域调用Http.sys托管API时Windows认证无凭据弹窗的问题

这个问题的核心在于跨域请求下浏览器不会自动发送Windows身份验证凭据(NTLM/Kerberos),加上Http.sys的认证处理逻辑和IIS存在差异,导致直接返回401错误而不触发登录弹窗。下面是具体的排查和解决步骤:

1. 配置Blazor HttpClient携带凭据

Blazor WebAssembly的默认HttpClient不会自动发送Windows凭据,你需要显式开启这个配置:

在Program.cs注册HttpClient时,添加Handler配置:

builder.Services.AddScoped(sp => 
{
    var apiBaseUrl = new Uri("https://localhost:44302/");
    var handler = new HttpClientHandler { UseDefaultCredentials = true };
    return new HttpClient(handler) { BaseAddress = apiBaseUrl };
});

如果是调用SignalR Hub,同样要在构建连接时启用凭据:

var hubConnection = new HubConnectionBuilder()
    .WithUrl("https://localhost:44302/yourHub", options =>
    {
        options.UseDefaultCredentials = true;
    })
    .Build();

2. 服务器端配置CORS允许凭据

跨域场景下,API服务器必须明确允许客户端携带凭据,且不能使用AllowAnyOrigin(必须指定具体的Blazor客户端地址):

在API的Program.cs中配置CORS策略:

builder.Services.AddCors(options =>
{
    options.AddPolicy("BlazorClientCorsPolicy", policy =>
    {
        policy.WithOrigins("https://localhost:5001") // 你的Blazor客户端地址
              .AllowAnyHeader()
              .AllowAnyMethod()
              .AllowCredentials(); // 关键:允许携带凭据
    });
});

// 确保在路由中间件之后、授权中间件之前启用CORS
app.UseCors("BlazorClientCorsPolicy");

3. 验证Http.sys的Windows认证配置

确认Http.sys已正确启用Windows认证方案(NTLM或Negotiate):

builder.WebHost.UseHttpSys(options =>
{
    options.Authentication.Schemes = AuthenticationSchemes.NTLM | AuthenticationSchemes.Negotiate;
    options.Authentication.AllowAnonymous = false;
});

如果API通过控制台运行,确保当前启动用户有权限进行Windows认证;如果作为Windows服务运行,检查服务账户的权限设置是否正确。

为什么IIS上能正常弹出弹窗?

当Blazor和API托管在同一个IIS站点时,它们属于同域(同域名+端口),浏览器会自动发送Windows凭据,无需额外配置CORS。而跨域场景下,浏览器出于安全限制,必须同时满足「客户端发送凭据」和「服务器允许凭据」两个条件,才会触发NTLM/Kerberos的认证流程(弹出登录窗口)。

内容的提问来源于stack exchange,提问作者Stanislav Čaja

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 16:09:12