【问题标题】:IIS Web Application Allowing Anonymous Access Although this is DisabledIIS Web 应用程序允许匿名访问,尽管这已禁用
【发布时间】:2021-06-10 23:36:13
【问题描述】:

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规范中规定请求必须经过身份验证才能执行?

这是最初的问题,背景是我一直在尝试做的事情以及我遇到的问题:

我有一个 Web 应用程序 - Webgate - 设置为 禁止 匿名访问。如下所示:

问题是,当我使用 Postman 与此应用程序交互时没有任何身份验证,事务成功。如下所示:

这怎么可能?

另一个屏幕截图以确认这是响应该 URL 的应用程序:

这是一个复杂性,尽管我看不出这与问题有什么关系。 Webgate 和 Webhook(见上面的截图)都是 IIS 中的两个站点,它们映射到文件系统中的同一个 Web 应用程序。 Webgate 配置为坚持 Authentication,Webhook 配置为允许匿名访问。同样,我看不到 Webhook 允许匿名访问如何对 Webgate 绑定中的事务产生任何影响。上下文的一些背景知识:通过 Webgate 进入的应用程序功能将是通过 Webhook 可访问的功能的超集。进入错误的接口不会导致安全性短路,因为在应用程序级别检查事务以确认当前事务是已识别的还是匿名的。这两个站点的全部目的是使通过开放接口 - Webhook - 进行的访问永远不会受到身份挑战,而进入受保护接口 - Webgate - 的交易总是受到身份验证挑战。

我以前做过这个,虽然不是最近,而且我从来没有遇到过这个问题。有一点复杂性,但最重要的是,如果一个站点被设置为禁止匿名访问并坚持基本身份验证,那么交易如何在没有受到挑战的情况下通过?这是我以前从未见过的。谢谢你的建议。

【问题讨论】:

  • 使用 FRT,docs.microsoft.com/en-us/iis/troubleshoot/… 跟踪这 200 个响应,您应该能够看到每个模块/处理程序如何参与以及可能出现的问题。
  • @LexLi 也许我遗漏了一些基本信息。如果我将应用程序实现为 HttpModule 是否让我负责在我的模块中执行身份验证?或者我应该能够在我的模块甚至看到请求之前依靠 IIS 来强制执行身份验证?
  • 如果我将应用程序池置于经典模式,我将获得预期的 IIS 基本身份验证配置。如果我将池置于集成模式,我看不到预期的身份验证。这是预期的行为还是配置错误?
  • 就像我说的,在两种情况下都收集 FRT 并进行比较。你不仅可以看到很多,而且还可以清楚地找出原因。这种调查比告诉你“是的,预期的”有用得多(尽管你可能想阅读docs.microsoft.com/en-us/iis/application-frameworks/… 之类的内容)。
  • “我的模块在身份验证模块之前被调用”清楚地表明您的模块编写得不好。大多数模块应该连接到像PostAuthenticateRequest 这样的事件(在我在上一条评论中提到的文章中),这样它们就不会与身份验证冲突,而不是BeginRequestAuthenticateRequest 这可能是由你的模块。

标签: authentication iis basic-authentication iis-8 httpmodule


【解决方案1】:

重新审视问题

总结一下到目前为止我们学到的东西,

  • 您为 ASP.NET 编写了托管模块。
  • 此模块挂钩到管道事件OnBeginRequest 以执行一些业务逻辑并在完成时调用ctx.ApplicationInstance.CompleteRequest()
  • 在 IIS 端使用了匿名身份验证。

那里一切正常,但你发现了,

  • 在 IIS 端使用基本身份验证时,集成管道模式开始出现问题
  • 切换回经典模式似乎可以解决问题。

原因

无论使用何种身份验证方法,您的模块都以经典模式工作,因为整个 ASP.NET 管道在 IIS 身份验证模块后面运行。

但是,集成模式与经典模式的工作方式不同,在经典模式中,您的模块不再在身份验证之后执行,而是在身份验证之前执行。

您通过收集 FRT 确认了这一点。

解决方案

就像我们讨论的那样,解决方案是简单地更改您的模块,使其挂钩到 OnPostAuthenticateRequest

参考

【讨论】:

  • 我的事件顺序略有不同,但总和在技术上是准确的。我的应用程序一直处于流水线模式,一切正常,因为所有应用程序功能都发布到匿名访问。我从 OnBeginRequest 开始做所有事情,从未注意到技术缺陷。当我开始发布需要身份验证的功能时,我注意到该请求从未受到过挑战,即使 IIS 已配置为这样做。我们现在知道为什么了。 (在此期间的一切都是我试图在不了解根本原因的情况下解决问题。:-) 感谢您的帮助!
  • @YossiGeretz 对其进行了修改以符合您的描述。
猜你喜欢
  • 1970-01-01
  • 2014-05-20
  • 2015-08-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-09
  • 2019-09-16
相关资源
最近更新 更多