Angular 9 + .NET 9后端(IIS托管,Windows身份验证)随机触发浏览器登录弹窗问题求助
Angular 9 + .NET 9后端(IIS托管,Windows身份验证)随机触发浏览器登录弹窗问题求助
各位技术大佬,我最近在做一个全栈应用时碰到了一个随机出现的Windows身份验证弹窗问题,折腾了好久没搞定,想请大家帮忙分析下:
技术栈
- 前端:Angular 9.1
- 后端:ASP.NET 9(部署在IIS上)
- 认证方式:Windows身份验证(WinAuth)
- 部署配置:Angular应用和后端一起在IIS上托管,通过HTTP拦截器给所有请求都加上了
withCredentials: true
问题详情
在使用应用的过程中,毫无规律地随机出现以下情况:当触发某个调用/api/UserModel/SaveUserModel的POST请求时,浏览器会突然弹出Windows身份验证的登录弹窗。如果我点击取消,请求就会失败,查看IIS日志能看到错误码是401 2 5。但诡异的是,同一个POST请求很多时候又能正常执行,完全不会弹出登录框。
已做的排查尝试
我已经做了不少排查,但还是没找到根因:
- 通过浏览器DevTools确认,所有请求确实都带有
withCredentials: true配置 - 查看后端日志发现,失败的请求根本没有到达任何后端中间件,相当于在IIS层面就被拦截了
- 对比IIS日志的成功和失败请求:
- 成功请求日志:状态码
200 0 0 - 失败请求日志:状态码
401 2 5(对应Windows身份验证未能接收到凭证)
- 成功请求日志:状态码
- 由于组策略限制,我无法修改浏览器的Internet设置(没法把站点添加到“本地Intranet”区域)
- 尝试过启用/禁用匿名身份验证,两种状态下都还是会随机出现弹窗
- 部署了前后端的调试版本并进行远程调试,但失败的请求依然没有到达后端代码层面
- 调整了IIS应用池设置:把空闲超时设为0(避免应用池因空闲回收导致的问题)
我的初步猜想
结合目前的排查结果,我有几个猜测,但没法验证:
- 浏览器在空闲一段时间后,或者某些特定的交互模式下,会停止自动发送Windows凭证
- 浏览器缓存的凭证在Angular的不同操作之间被莫名失效或丢弃
- 当自动登录不被允许时,Windows身份验证的重新协商流程触发了登录弹窗
希望得到的帮助
真心求问各位大佬:
- 为什么浏览器会随机触发Windows身份验证弹窗?有没有什么容易忽略的触发条件?
- 明明已经设置了
withCredentials: true,什么情况下浏览器会不发送凭证? - 有没有办法让Angular或者浏览器在不弹出登录框的前提下,自动用当前用户的凭证重试请求?
- 任何相关的排查思路、最佳实践或者类似的踩坑经验都非常感谢!
内容来源于stack exchange
相关产品推荐
相关产品推荐

