Azure Application Gateway下Windows认证ASP.NET应用偶发身份错配与会话错乱问题
根因定位
你初步推断的网关未正确转发Windows身份不成立,日志显示请求的Windows身份已完成认证、且与会话ID绑定为同一合法用户,异常根源是NTLM认证的有状态特性与Azure Application Gateway后端连接复用机制的冲突。
触发逻辑
Windows集成认证默认优先使用NTLM协议,该协议的认证上下文会与TCP持久连接(Keep-Alive)强绑定:
- NTLM的挑战-响应流程完成后,后端IIS会将该连接的后续所有请求直接识别为已认证的该用户,无需重复发起认证挑战
- Azure Application Gateway为提升性能,默认复用与后端建立的持久TCP连接,当多个不同用户的请求被调度到同一后端连接转发时,IIS会将所有请求统一识别为该连接上最初完成认证的用户,直接出现身份、会话ID错配
- 单后端场景下未启用网关会话亲和不影响该问题,问题核心是后端连接的身份绑定规则,与后端路由策略无关
直接访问后端无异常的原因是,客户端与IIS建立的TCP连接为用户专属,不会出现跨用户复用的情况。
验证方法
- 导出后端IIS日志,筛选异常时间点的请求,可观察到不同用户的请求对应相同的
connection-id字段 - 临时调整Azure Application Gateway的后端HTTP设置,关闭后端Keep-Alive连接复用,观察异常是否消失
解决方案
- 优先将Windows认证协议从NTLM切换为Kerberos:Kerberos为无状态认证,每个请求独立携带身份票据,与TCP连接无关,从根源避免身份绑定问题
- 若无法切换Kerberos,可在Azure Application Gateway的后端HTTP配置中关闭后端连接复用,或将后端Keep-Alive超时时间调整为极短值,降低连接复用概率
- 也可在后端IIS的Windows认证高级设置中启用扩展保护(Extended Protection),限制NTLM认证上下文的跨连接复用
额外说明
你当前使用的SQL Server模式会话状态配置如下,本身无问题:
<sessionState mode="SQLServer" stateNetworkTimeout="30" timeout="30" allowCustomSqlDatabase="true" sqlConnectionString="Data source=***********************;Database=ASPState;Integrated Security=SSPI;Persist Security Info=True" />
可额外核对Azure Application Gateway的请求转发规则,确保客户端携带的ASP.NET_SessionId Cookie未被网关篡改或删除,可通过网关访问日志对比客户端原始请求与转发至后端的请求头内容验证。
内容的提问来源于stack exchange,提问作者Polyfun
相关产品推荐
相关产品推荐

