IIS Web 应用程序允许匿名访问虽然这是禁用的

问题描述

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 - 设置为禁止匿名访问。这是它的样子:

IIS Authentication Configuration

问题是,当我使用 Postman 与此应用程序交互时没有任何身份验证,交易成功。这是它的样子:

Postman Anonymous POST

这怎么可能?

再用一张屏幕截图来确认这是响应该 URL 的应用程序:

Site Binding

这是一种复杂性,虽然我看不出这与问题有什么关系。 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

参考文献

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...