我在IIS7上有一个以集成模式运行的站点,并且已经更改了web.config,以便对静态文件进行身份验证。我想修复的是,当一个不存在的文件的请求传入时,它仍然通过.NET身份验证管道,我通过调试Begin_request()方法看到该请求是为/login.aspx发出的?returnurl=filenotfound.js(此处转述)。
有人知道如何在身份验证生效之前捕获并返回404吗?
感谢
我的主要建议是;不要。
如果您需要对某些资源进行身份验证,那么您可能有需要隐藏的内容。当你有什么要隐瞒的时候,你应该注意你在透露什么,当你对一个有文件的资源和一个没有文件的资源做出不同的回应时,你在透露一些东西。
这是一个主要的安全漏洞吗?我不能说,但这足以向攻击者透露一些信息。这当然是攻击面的扩大,所以你有两个选择。
- 进行艰苦的分析,以证明哪些URI映射到文件,哪些没有映射到文件的信息对攻击者没有好处
- 要求对请求进行身份验证,即使它只会给经过身份验证的用户一个404
后者更容易出错。
也就是说,有几种方法可以在集成模式的ASP.NET中进行身份验证。您是否在处理AuthorizeRequest
和AuthenticateRequest
事件的模块中执行此操作?你可以让他们检查是否发生了这样的情况(检查URI是否映射到现有文件),如果是这样的话,就不发送401。
您可以在应用程序级别将404映射到*.aspx页面。因此,对不存在的资源的所有请求都将被重新映射到页面,querystring参数将指示不存在资源的名称。假设该页面可以从授权引擎中排除(每个人都可以使用),您可以将处理不同情况的精确逻辑放在该页面上。
<httpErrors errorMode="Custom">
<remove statusCode="404" subStatusCode="-1"/>
<error statusCode="404" prefixLanguageFilePath="" path="/ErrorHandler.aspx" responseMode="ExecuteURL"/>
</httpErrors>
这样,所有404都被路由到ErrorHandler.aspx?404;theurlofnonexistingresource
。