我在 Azure 中的 Windows Server 2019 DataCenter 上的 IIS 10 中托管了一个 ASP.Net 站点。此站点仅启用了 Windows 身份验证。
当我直接访问该网站时(http://mysite-backend.example.com) 系统提示我输入凭据,之后一切正常。当我通过应用程序网关(配置了私有 IP)访问网站时(https://mysite.example.com) 系统提示我输入凭证,之后系统再次提示我请求其他资源(托管在同一站点上,没有任何子文件夹的特殊规则)。系统不断提示我,直到我单击“取消”,此时我在 Chrome 的网络日志中看到资源请求的 401。
我遇到此问题的一个资源是 GET 请求favicon.png
。如果我直接访问资源(https://mysite.example.com/favicon.png) 一切正常,但当我访问网站的页面时,浏览器会将此资源的请求作为页面资源的一部分发送,这时我会看到错误。这意味着该资源是可以访问的;但在“事务”中处理该资源的方式存在问题。
我尝试过不同的浏览器,包括全新安装的浏览器/不同的客户端设备,以确保缓存中没有任何内容导致问题。此外,我还Disable Cache
检查了 F12 网络设置,以确保我在两个站点之间进行了完整的请求/公平的比较。
后端池只有 1 个节点。后端设置表示使用后端池的主机名而不是前端的主机名 - 因此从 Web 服务器的角度来看,请求看起来相似。
在 Web 服务器的安全事件日志中,我看到4625
使用我的测试用户名登录失败(事件 ID);确认请求使用正确的用户名发送到后端服务器(并且我非常小心地确保始终输入正确的密码 / 已多次执行此操作以消除人为错误的可能性 / 尝试使用和覆盖保存的密码)。如果我尝试次数过多,我的测试帐户将被锁定(即在 AD 中属性lockedout
设置为true
);之后所有请求都会收到 401 响应(可以理解)。
我检查了 App Gateway 日志,确认它没有阻止任何内容。我还为此网站设置了自定义 WAF 规则,并将其设置为detection only
模式,以确保它无法阻止请求;以防万一某些内容被阻止但未记录。
我在后端服务器上启用了状态 401 的失败请求跟踪;显示 401 来自:
-MODULE_SET_RESPONSE_ERROR_STATUS
ModuleName: IIS Web Core
Notification: AUTHENTICATE_REQUEST
HttpStatus: 401
HttpReason: Unauthorized
HttpSubStatus: 2
ErrorCode: Access is denied. (0x80070005)
ConfigExceptionInfo
注意:当我在给定时间段内在同一台设备上测试时,被阻止的资源(即获得 401 响应)通常是一致的;但如果我在不同的日期或不同的设备上测试,我可能会看到不同的资源被阻止。我第一次在任何设备上测试时(大多数情况下),我看到两个对页面POST
的 xhr 请求/subfolder###/Search
失败,然后在该设备上进行几次测试后,其他资源似乎被污染了。这感觉像是主要原因 - 但随后某些事情导致会话出现问题。
我正在尝试访问后端站点的源代码,以便更好地了解这些搜索端点在其中编码的内容,以了解是否是导致问题的原因。
与此同时,如果任何人有想法,我们都会非常感激...提前谢谢。
更新:直接调用搜索端点也会导致 HTTP 200 /有效响应:
$resp = Invoke-RestMethod -Method Post -Uri 'https://mySite.example.com/subfolder###/Search' -Form @{recordsToTake=25;recordsToSkip=0;sortColumn='CategorieName';sortDirection='Ascending'} -Credential $cred -StatusCodeVariable sc;"Status $sc";$resp
答案1
应用程序网关不支持 NTLM(“Windows 身份验证”)(微软文档)。
出于安全考虑,反向代理似乎通常不实现 NTLM 支持(MS YARP NTML 讨论)。
有一些替代的反向代理可以处理这个问题;例如nginx 加(商业 nginx 产品)。