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

AspNetCore Blazor应用无法传递Windows凭据至API的问题求助

解决Blazor Server部署IIS后调用Web API的401.2 Unauthorized问题

你遇到的是典型的Kerberos双跳问题:Blazor Server运行在IIS时,默认无法将前端用户的Windows身份委派给后端Web API,而是使用应用池的机器账户(domain\servername$)发起请求,而该账户没有API的访问权限,导致错误代码0x80070005(权限不足)。以下是分步解决方案:

1. 确认域环境与账户准备

  • 确保Blazor Server和Web API所在服务器均加入同一Active Directory域
  • 若使用自定义域账户作为应用池身份,确保该账户已加入域;若使用默认的机器账户(domain\servername$),直接使用即可

2. 注册服务主体名称(SPN)

以域管理员身份在域控制器上执行以下命令,为Web API和Blazor Server注册SPN(Kerberos委派的必要条件):

为Web API注册SPN

setspn -S HTTP/servername.com:port domain\api-apppool-account
  • 替换servername.com:port为Web API的实际域名和端口
  • 替换domain\api-apppool-account为Web API应用池的运行账户(机器账户则为domain\servername$)

为Blazor Server注册SPN(可选,若Blazor Server使用自定义域账户)

setspn -S HTTP/blazor-server-domain.com domain\blazor-apppool-account

3. 配置约束委派

  1. 打开Active Directory用户和计算机,找到Blazor Server应用池对应的账户(机器账户或自定义域账户)
  2. 右键→属性→切换到委派选项卡
  3. 选择信任此用户以委派指定服务,点击添加
  4. 查找并添加Web API的SPN(HTTP/servername.com:port),仅勾选Kerberos协议

4. 调整Blazor Server的HttpClient配置

移除硬编码凭据的代码,改为使用当前用户身份委派:

在Program.cs中注册HttpClient

builder.Services.AddHttpClient("ApiClient", client =>
{
    client.BaseAddress = new Uri("http://servername.com:port/");
    client.Timeout = TimeSpan.FromSeconds(10);
}).ConfigurePrimaryHttpMessageHandler(() => new HttpClientHandler
{
    UseDefaultCredentials = true,
    PreAuthenticate = true
});

在Blazor组件中使用HttpClient

private readonly HttpClient _httpClient;

public YourComponent(IHttpClientFactory httpClientFactory)
{
    _httpClient = httpClientFactory.CreateClient("ApiClient");
}

// 调用API示例
private async Task FetchData()
{
    var response = await _httpClient.GetAsync("endpoint");
    response.EnsureSuccessStatusCode();
    // 处理响应数据
}

5. 验证IIS与应用配置

  • 确保Blazor Server和Web API的IIS站点仅启用Windows Authentication,禁用Anonymous Authentication
  • 确认两者的Program.cs中认证配置正确(中间件顺序不能错):
builder.Services.AddAuthentication(NegotiateDefaults.AuthenticationScheme)
    .AddNegotiate();

builder.Services.AddAuthorization(options =>
{
    options.FallbackPolicy = options.DefaultPolicy;
});

// 中间件顺序:先认证,再授权
app.UseAuthentication();
app.UseAuthorization();

6. 测试验证

  • 重启Blazor Server和Web API的IIS站点
  • 清除浏览器缓存后重新访问,检查API请求是否使用当前登录的域用户身份

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 15:16:20