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

