ASP.NET Web API2+Angular下Windows认证反复弹登录框无法登录问题
问题表现
应用后端采用.NET Web API 2、前端采用Angular,启用Windows认证完成配置后,访问受保护接口时弹出Windows登录凭据弹窗,输入凭据后始终无法通过验证,无法执行后续操作。
相关界面参考:

现有业务代码
当前Auth控制器实现如下:
[EnableCors(origins: "*", headers: "*", methods: "*", SupportsCredentials = true)] public class AuthController : ApiController { [Authorize] [HttpGet] public Dictionary<string, string> WindowsLogin() { var name = User.Identity.Name; var result = new Dictionary<string, string>(); if (User.Identity.IsAuthenticated) { result["User"] = name; result["Key"] = EncodePassword(name); } return result; } private String EncodePassword(String originalPassword) { SHA256 sha = new SHA256Managed(); return BitConverter.ToString(sha.ComputeHash(Encoding.Unicode.GetBytes(originalPassword))).Replace("-", "").ToLower(); } }
故障原因与修复方案
故障按出现概率从高到低排序排查:
CORS配置违反浏览器安全规则
当前代码中CORS策略同时配置了origins: "*"(通配允许所有源)和SupportsCredentials = true(允许携带凭据),这一组合直接被W3C CORS规范禁止,是凭据反复验证失败的核心原因。Windows认证依赖浏览器传递NTLM/Kerberos身份令牌,必须明确指定受信任的前端源地址,不能使用通配符。
修复方式:将origins参数替换为Angular应用实际部署的地址,多地址用逗号分隔,示例:[EnableCors(origins: "http://localhost:4200,https://your-prod-frontend.com", headers: "*", methods: "*", SupportsCredentials = true)]如果是全局配置CORS,同步修改Web.config里的CORS规则,确保没有通配源+允许凭据的组合。
前端请求未开启凭据携带配置
即使后端CORS配置正确,Angular发起HTTP请求时如果没有开启withCredentials配置,浏览器不会把Windows认证所需的身份令牌发送给后端,后端持续返回401未授权状态,就会反复弹出凭据输入框。
修复方式:全局配置Angular HTTP客户端默认携带凭据,示例:// 全局HTTP拦截器逻辑 intercept(req: HttpRequest<any>, next: HttpHandler) { const modifiedReq = req.clone({ withCredentials: true }); return next.handle(modifiedReq); }单接口调用时直接在请求选项中加入
{ withCredentials: true }即可。服务端认证配置错误
检查Web.config配置,必须关闭匿名认证,仅启用Windows认证,参考配置:<system.web> <authentication mode="Windows" /> <authorization> <deny users="?"/> </authorization> </system.web> <system.webServer> <security> <authentication> <anonymousAuthentication enabled="false" /> <windowsAuthentication enabled="true" providers="Negotiate,NTLM" /> </authentication> </security> </system.webServer>如果是IIS部署,需要先在服务器角色中安装「Windows认证」功能,否则配置不会生效。域环境下需要确认客户端访问的后端地址被加入浏览器的「本地Intranet」站点列表,否则浏览器默认不会自动传递当前登录用户的域凭据,手动输入凭据时如果没有加域前缀(格式为
域名\用户名)也会验证失败。本地开发环回限制问题
本地调试使用localhost访问时,Chrome/Edge高版本默认会阻止环回接口的Windows凭据传递,可临时在浏览器启动参数中添加--disable-loopback-network-interface-restriction测试,也可以将后端服务绑定到本机实际IP,通过IP+端口访问调试。
内容的提问来源于stack exchange,提问作者Khadija Mehmood

