IIS条件跳过内置Windows身份验证 为TFS旧应用适配2FA相关问题
解决方案
原方案失效原因
IIS原生Windows身份验证模块的执行优先级高于用户自定义的HTTP模块,请求还未进入你编写的自定义模块逻辑,IIS就已经完成401质询返回,因此你的代码没有触发机会。
可行实现方案
方案1:调整模块执行顺序+原有自定义代码
- 先在IIS代理站点的身份验证配置中,同时启用「匿名身份验证」和「Windows身份验证」,匿名身份验证标识保持默认IUSR即可
- 进入IIS站点的「模块」功能,找到你开发的自定义HTTP模块,点击「上移」按钮,将其移动到
WindowsAuthentication模块之前 - 保留你现有的
SkipAuthorization配置代码,即可在Windows认证触发前完成条件判断,符合要求的请求会直接跳过后续认证流程,以匿名身份透传
方案2:纯配置实现(无需修改代码)
通过IIS的<location>标签+URL Rewrite规则实现条件跳过认证:
步骤1:配置静态路径匿名访问
在站点根目录的web.config中添加如下配置,单独为/_static/*路径开放匿名访问,关闭Windows认证:
<location path="_static"> <system.web> <authorization> <allow users="?" /> </authorization> </system.web> <system.webServer> <security> <authentication> <windowsAuthentication enabled="false" /> <anonymousAuthentication enabled="true" /> </authentication> </security> </system.webServer> </location>
步骤2:配置JWT请求跳过认证
- 先进入IIS站点的URL Rewrite功能,点击「查看服务器变量」,新增允许的变量
SKIP_AUTHORIZATION - 在
web.config的system.webServer节点下添加如下重写规则,匹配携带Bearer头的JWT请求,自动跳过认证:
<rewrite> <rules> <rule name="Skip Windows Auth for JWT" stopProcessing="false"> <match url=".*" /> <conditions> <add input="{HTTP_AUTHORIZATION}" pattern="^Bearer .+" /> </conditions> <serverVariables> <set name="SKIP_AUTHORIZATION" value="1" /> </serverVariables> <action type="None" /> </rule> </rules> </rewrite>
注意事项
- 如果你使用IIS ARR作为反向代理组件,需要在ARR代理设置中开启「保留客户端请求头」,避免JWT的Authorization头被代理丢弃
- 经典管道模式下,自定义HTTP模块需要同时在
system.web/httpModules节点注册,仅在system.webServer/modules注册不会被加载
内容的提问来源于stack exchange,提问作者davidgiga1993
相关产品推荐
相关产品推荐

