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

Blazor WASM客户端如何通过Windows Authentication调用内网DevOps Server API

实现前提说明

你所在的场景是纯内网域环境,微软不推荐Blazor WASM配Windows身份验证的核心原因是该方案仅适合内网域环境,公网场景兼容性差,你的场景完全可以用。

注意:Blazor WASM运行在浏览器沙箱内,无法直接读取系统的Windows凭据,所有凭据传递依赖浏览器的原生集成认证能力,无需你手动获取、拼接Token。


具体实现步骤

1. 内网环境前置配置

先将Blazor WASM站点域名、DevOps Server API的域名,统一加入客户端浏览器的本地Intranet信任站点列表,域管理员可以通过组策略批量推送该配置,无需用户手动设置。配置后浏览器会自动对信任站点传递当前登录用户的Windows凭据,不会弹出认证输入框。

2. Blazor WASM客户端配置

2.1 自定义请求处理Handler

新建WindowsAuthHandler.cs,核心是给请求加浏览器凭据携带标识:

public class WindowsAuthHandler : DelegatingHandler
{
    protected override async Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
    {
        // 通知浏览器:该请求需要携带当前用户的Windows凭据
        request.SetBrowserRequestCredentials(BrowserRequestCredentials.Include);
        // 声明使用协商认证(Kerberos/NTLM自动适配)
        request.Headers.TryAddWithoutValidation("Authorization", "Negotiate");
        return await base.SendAsync(request, cancellationToken);
    }
}

2.2 注册DevOps专用HttpClient

在客户端项目的Program.cs中注册服务:

// 注册自定义Handler
builder.Services.AddScoped<WindowsAuthHandler>();
// 注册指向DevOps API的HttpClient
builder.Services.AddHttpClient("DevOpsClient", client =>
{
    client.BaseAddress = new Uri("替换为你的DevOps Server API内网根地址");
})
// 注入Windows认证处理逻辑
.AddHttpMessageHandler<WindowsAuthHandler>();

2.3 调用示例

业务代码中注入IHttpClientFactory,直接发起请求即可,浏览器会自动完成整个Windows身份验证握手流程,无需额外处理:

@inject IHttpClientFactory _httpFactory

async Task CallDevOpsApi()
{
    var client = _httpFactory.CreateClient("DevOpsClient");
    // 示例:获取DevOps工作项列表
    var result = await client.GetFromJsonAsync<WorkItemList>("_apis/wit/workitems?api-version=6.0");
}

该请求完全从客户端发起,不需要经过你的后端服务中转,DevOps API收到的身份就是当前客户端登录的域用户身份,完全符合你的需求。

3. DevOps Server端CORS配置

因为是跨域请求,需要在DevOps Server的部署环境中配置CORS规则,允许你的Blazor站点访问:
如果DevOps是IIS部署,修改站点根目录的web.config:

<system.webServer>
  <httpProtocol>
    <customHeaders>
      <add name="Access-Control-Allow-Origin" value="替换为你的Blazor WASM站点完整域名" />
      <add name="Access-Control-Allow-Credentials" value="true" />
      <add name="Access-Control-Allow-Headers" value="Authorization, Content-Type" />
      <add name="Access-Control-Allow-Methods" value="GET, POST, PUT, DELETE, OPTIONS" />
    </customHeaders>
  </httpProtocol>
</system.webServer>

注意:Access-Control-Allow-Origin不能设置为*,必须填写Blazor站点的具体域名,否则浏览器会拦截带凭据的跨域请求。


常见问题排查

  • 弹出Windows认证输入框:检查两个站点是否都已加入本地Intranet信任列表,客户端是否已登录域账号
  • 请求返回401:检查DevOps Server是否已开启Windows身份验证、关闭了匿名认证,CORS配置是否正确
  • .NET 5版本兼容:确保使用.NET 5 RC2及以上版本,早期版本的SetBrowserRequestCredentialsAPI存在已知bug

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 09:54:03