【问题标题】:HTTP Module intercept requests and breaks custom errors configurationHTTP 模块拦截请求并中断自定义错误配置
【发布时间】:2015-05-06 11:28:13
【问题描述】:

我有一个 ASP.NET MVC 5 Web 应用程序,它在 IIS 8.5 上本地运行,部署后在 Azure 网站上运行 - 在这两种情况下,稍后将描述的行为是相同的。

我在 web.config 中配置了以下自定义错误页面管理(它涵盖了我所有的自定义错误案例,并且已经过测试并且效果很好):

<system.webServer>
  <httpErrors errorMode="Custom" existingResponse="Replace">
    <clear />
    <error statusCode="400" responseMode="ExecuteURL" path="/App/Error"/>
    <error statusCode="403" responseMode="ExecuteURL" path="/App/Error/Forbidden" />
    <error statusCode="404" responseMode="ExecuteURL" path="/App/Error/NotFound" />
    <error statusCode="500" responseMode="ExecuteURL" path="/App/Error" />
  </httpErrors>
</system.webServer>

另外,我在同一个 web.config 中配置了一个 HTTP 模块,如下所示:

<system.webServer>
<modules>
  <add name="ImageProcessorModule" type="ImageProcessor.Web.HttpModules.ImageProcessingModule, ImageProcessor.Web" />
 </modules>
</system.webServer>

我遇到的问题是这样的:如果我向 .../c&lt; 这样的奇怪 URL 发出请求,应用程序会按照 web.config 文件中的说明执行 500 自定义错误路径。 但是,如果我向.../&lt;c 之类的陌生 URL(模拟 html 标记)发出请求,虽然结果错误为 500,但自定义错误不再执行,因为根据详细错误,HTTP 模块拦截呼叫并“决定”只显示 YSOD...

我得到的信息是:

从客户端检测到有潜在危险的 Request.RawUrl 值 (="/App/

而且很容易看出这是由于stacktrace的webmodule引起的:

[HttpRequestValidationException (0x80004005):从客户端检测到潜在危险的 Request.RawUrl 值 (="/App/d__10.MoveNext() +201 System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务任务)+144 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务任务)+84 System.Web.TaskAsyncHelper.EndTask(IAsyncResult ar) +98 System.Web.AsyncEventExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +434 System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +288

如果我从 web.config 中注释掉图像处理器模块,一切都会按预期运行。

为什么在这种情况下,自定义错误路径没有得到执行?

感谢您的时间和回答。

【问题讨论】:

标签: asp.net asp.net-mvc azure iis-8.5 imageprocessor


【解决方案1】:

我非常怀疑这是Image Processor 中的错误。

Client Dependency(Umbraco 的一个模块)报告了完全相同的问题,虽然完全不相关,但相似之处在于它在请求管道的同一阶段访问 Context.Request.RawUrl

你有两个选择:-

  1. 找到一种方法来设置 runAllManagedModulesForAllRequests="false" 而不会影响您的 http 模块的行为

  2. 看看您是否可以向https://github.com/JimBobSquarePants/ImageProcessor/blob/f4080c3217107eb7a571eb69e54cc5e69e1c892c/src/ImageProcessor.Web/HttpModules/ImageProcessingModule.cs 提交补丁以使用Request.Unverified.RawUrl 而不是Request.RawUrl

【讨论】:

  • 非常感谢。我将检查这两种可能性,看看哪一种是最好的。老实说,我会尝试做#2。再次感谢您的宝贵时间。 LE:我会回来看看哪个在这种情况下有效。
  • 好收获。选项 2 绝对是最好的,因为 ImageProcessor 不依赖于 runAllManagedModulesForAllRequests 为真,但其他模块可能。
  • 是的 - 你是对的!我已经完成了 ImageProcessor.Web 项目的本地克隆并更改了您的建议,然后我将编译后的 DLL 放入我的项目中并且它正在工作......所以你是对的......现在,我必须看看我的更改是否会被接受,因为从安全的角度来看,我不知道我的更改会带来哪些影响;我只改变了两个地方:request.RawUrlrequest.Unvalidated.RawUrl
  • 我认为这不是问题。我会仔细检查,但应该没问题。
猜你喜欢
  • 1970-01-01
  • 2020-03-24
  • 1970-01-01
  • 2011-06-14
  • 2017-02-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-19
相关资源
最近更新 更多