【发布时间】: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这样的事件(在我在上一条评论中提到的文章中),这样它们就不会与身份验证冲突,而不是BeginRequest或AuthenticateRequest这可能是由你的模块。
标签: authentication iis basic-authentication iis-8 httpmodule