IIS Web 应用程序允许匿名访问,尽管已禁用

IIS Web Application Allowing Anonymous Access Although this is Disabled

Windows 服务器 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 规范,该规范规定请求必须经过身份验证才能执行?

这是原始问题,背景是我一直在尝试做的事情和我一直遇到的问题:

我有一个 Web 应用程序 - 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

参考资料