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
。
参考资料
- Microsoft 在 an important article 中发布了管道更改,因此每个人都应该熟悉其中的细节。
- 从经典迁移到集成需要 a good guide
- module/handler 开发人员的 FRT 是 always a handy helper
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
。
参考资料
- Microsoft 在 an important article 中发布了管道更改,因此每个人都应该熟悉其中的细节。
- 从经典迁移到集成需要 a good guide
- module/handler 开发人员的 FRT 是 always a handy helper