问题描述
Windows Server 2012 R2,IIS 8
我做了更多的诊断。 web.config 文件中的这一行覆盖在 IIS 中指定的身份验证配置是什么?
<configuration>
<system.webServer>
<modules>
<add name="Webhook" type="MyApp.Webhook" preCondition="" />
</modules>
</system.webServer>
</configuration>
我将 Webhook 文件夹复制到 Webgate 文件夹并将 Webgate 站点映射到 Webgate 文件夹。通过反复试验,我可以看到只要在 web.config 文件中定义了该模块,就可以匿名访问该站点。删除该行后,我会在匿名请求中看到 401 Unauthorized。奇怪,为什么我处理请求的模块的规范要覆盖 IIS 规范,该规范规定请求必须经过身份验证才能执行?
这是我一直在尝试做的事情的背景以及我遇到的问题的原始问题:
我有一个网络应用程序 - Webgate - 设置为禁止匿名访问。这是它的样子:
问题是,当我使用 Postman 与此应用程序交互时没有任何身份验证,交易成功。这是它的样子:
这怎么可能?
再用一张屏幕截图来确认这是响应该 URL 的应用程序:
这是一种复杂性,虽然我看不出这与问题有什么关系。 Webgate 和 Webhook(见上面的截图)都是 IIS 中的两个站点,它们映射到文件系统中的同一个 Web 应用程序。 Webgate 配置为坚持身份验证,Webhook 配置为允许匿名访问。同样,我没有看到 Webhook 允许匿名访问如何对 Webgate 绑定中的事务产生任何影响。上下文的一些背景:通过 Webgate 进入的应用程序功能将是可通过 Webhook 访问的内容的超集。由于在应用程序级别检查事务以确认当前事务是识别的还是匿名的,因此无法通过进入错误的接口来缩短安全性。这两个站点的全部目的是使通过开放接口(Webhook)的访问永远不会受到身份验证的挑战,而进入受保护接口(Webgate)的交易总是会受到身份验证的挑战。
我以前做过这个,虽然不是最近,而且我从来没有遇到过这个问题。有一点复杂性,但最重要的是,如果将站点设置为禁止匿名访问并坚持基本身份验证,那么交易如何在不受到质疑的情况下进行?这是我以前从未见过的。谢谢你的建议。
解决方法
重新审视这个问题
总结一下我们目前学到的东西
- 您为 ASP.NET 编写了一个托管模块。
- 此模块挂钩管道事件
OnBeginRequest
以执行一些业务逻辑并在完成时调用ctx.ApplicationInstance.CompleteRequest()
。 - 在 IIS 端使用了匿名身份验证。
那里一切正常,但你发现,
- 在 IIS 端使用基本身份验证时,集成管道模式开始出现问题
- 切换回经典模式似乎可以解决问题。
原因
无论使用何种身份验证方法,您的模块都在经典模式下工作,因为整个 ASP.NET 管道都在 IIS 身份验证模块后面运行。
但是,集成模式的工作方式与经典模式不同,在经典模式中,您的模块不再在身份验证之后执行,而是在身份验证之前执行。
您通过收集 FRT 确认了这一点。
解决方案
就像我们讨论的那样,解决方案是简单地更改您的模块,使其改为挂钩到 OnPostAuthenticateRequest
。
参考文献
- Microsoft 在 an important article 中发布了管道更改,因此每个人都应该熟悉详细信息。
- 从经典迁移到集成需要 a good guide
- FRT 对于模块/处理程序开发人员来说是 always a handy helper