启用Windows Authentication后ASP.NET Core Web API远程访问异常求助
问题描述
基于Visual Studio 2022(版本17.8.5)的「ASP .NET Core Web API项目模板」创建Web服务时遇到以下问题:
- 未启用Windows身份验证时,将localhost替换为电脑名称后,其他电脑或用户账户可正常远程访问服务
- 启用「Windows身份验证」后,本地浏览器访问服务正常,但远程访问时报错:
InvalidOperationException: 在身份验证握手请求之间收到了匿名请求。
调试器输出窗口的详细错误日志:
Microsoft.AspNetCore.Authentication.Negotiate.NegotiateHandler: 错误: 处理身份验证请求时发生异常。
System.InvalidOperationException: 在身份验证握手请求之间收到了匿名请求。
在Microsoft.AspNetCore.Authentication.Negotiate.NegotiateHandler.HandleRequestAsync()
解决方法
1. 修正服务端认证配置
在Program.cs中确保Windows身份验证的配置正确,且中间件顺序无误:
// 添加Windows身份验证服务 builder.Services.AddAuthentication(NegotiateDefaults.AuthenticationScheme) .AddNegotiate(); // 配置授权策略,确保默认策略生效 builder.Services.AddAuthorization(options => { options.FallbackPolicy = options.DefaultPolicy; }); // 中间件顺序必须是先认证后授权 app.UseAuthentication(); app.UseAuthorization();
2. 检查IIS Express调试设置
若使用IIS Express调试服务:
- 右键项目 → 属性 → 切换到「调试」选项卡
- 勾选「启用Windows身份验证」,取消勾选「启用匿名身份验证」
- 点击「Web服务器设置」中的「修改」按钮,确认Windows身份验证已启用、匿名身份验证已禁用
3. 调整客户端请求凭证设置
远程客户端必须正确发送Windows身份凭证,避免匿名请求中断认证握手:
- 浏览器访问:确保浏览器自动发送当前Windows账户凭证(以Edge为例:设置→隐私、搜索和服务→安全性→本地Intranet区域→开启「自动登录到Intranet区域」)
- 代码调用(以HttpClient为例):启用默认凭证发送
using var client = new HttpClient(new HttpClientHandler { UseDefaultCredentials = true }); var response = await client.GetAsync("http://你的电脑名称/api/weatherforecast");
4. 非域环境下启用NTLM fallback
如果服务端和客户端不在同一域环境,需在Program.cs中配置允许NTLM认证:
builder.Services.AddAuthentication(NegotiateDefaults.AuthenticationScheme) .AddNegotiate(options => { options.AllowNtlm = true; });
内容的提问来源于stack exchange,提问作者PrfctByDsgn
相关产品推荐
相关产品推荐

