来自HTTP模块的HttpContext.RewritePath()产生403禁止

时间:2014-09-16 22:50:06

标签: asp.net iis url-rewriting httpmodule

我想使用以下HTTP模块将请求重写到另一个文件夹的文件中:

public class MyHttpModule : IHttpModule
{
    public void Init(HttpApplication application)
    {
        application.BeginRequest += (sender, e) =>
            {
                var httpApplication = (HttpApplication)sender;
                var httpContext = httpApplication.Context;

                if (httpContext.Request.Url.ToString().Contains("styles/style.css"))
                {
                    httpContext.RewritePath("~/some/other/folder/styles/style.css");
                }
            };
    }

    public void Dispose() { }
}

代码似乎按预期工作(即在RewritePath() Request.Url包含重写的URL之后)但是当我尝试打开styles / style.css时出现403.2禁止错误。

当我在浏览器中打开重写的URL(在Request.Url调用之后从RewritePath()获取)时,我正确地看到了CSS文件(即我打开类似styles / style.css的东西并得到了什么&# 39; s在some / other / folder / styles / style.css下。

失败的请求跟踪还显示我的模块执行了正确的重写。这个跟踪条目对应于错误:

82.  -NOTIFY_MODULE_END
ModuleName ManagedPipelineHandler 
Notification MAP_REQUEST_HANDLER 
fIsPostNotificationEvent false 
NotificationStatus NOTIFICATION_CONTINUE 

83.  -MODULE_SET_RESPONSE_ERROR_STATUS 
ModuleName IIS Web Core 
Notification MAP_REQUEST_HANDLER 
HttpStatus 403 
HttpReason Forbidden
HttpSubStatus 2 
ErrorCode Access is denied. (0x80070005) 

84.  -SECURITY_DENIED_BY_ACCESS_FLAGS 
CurrentFlags 512 
NeededFlags 1

据我所知,它需要AccessRead(1)权限,但获得了AccessScript(512)(请参阅this topic)。这让我很困惑,因为我猜后者的权限级别比前者高。

更改相关文件的文件夹上的文件系统权限似乎没有效果(即使完全控制每个人都没有帮助)。应用程序池正在使用我的用户(管理员帐户)作为其身份(但将其保留在AppPoolIdentity上并不帮助)。

该文件的文件夹有一个Web.config,如果重要的话,它包含这个:

<handlers accessPolicy="Script,Read">
  <add name="StaticFile" path="*" verb="*" modules="StaticFileModule" preCondition="integratedMode" resourceType="File" requireAccess="Read" />
</handlers>

使用IIS URL Rewrite模块进行相同的重写。

更新

我注意到在原始的,不是现有的路径(即〜/ styles / style.css)下创建了一个物理文件夹,只包含一个带有上述处理程序声明的Web.config(加上system.webServer周围的共同仪式)等)使错误消失。当然,这不是我的解决方案,但至少它提供了一些暗示。

UPDATE2:

我使用空的ASP.NET应用程序进行了一些测试。仅在根Web.config中设置模块,而不是将Web.config添加到Styles文件夹。

将此添加到根Web.config(这是原始应用程序的Web.config中的内容)导致错误。哈!

<handlers accessPolicy="Script">
  <clear />
</handlers>

将accessPolicy修改为&#34;脚本,读取&#34;。解决了这个问题......

有人可以解释一下吗?

1 个答案:

答案 0 :(得分:0)

您可以尝试在&#34;某些&#34;中使用web.config。文件夹[〜/ some / other / folder / styles / style.css]并删除其子文件夹中的所有web.config文件。在唯一的web.config中你可以试试这个:

<handlers accessPolicy="Script,Read">
  <!--
  iis7 - for any request to a file exists on disk, return it via native http module.
  accessPolicy 'Script' is to allow for a managed 404 page.
  -->

  <add name="StaticFileHandler" path="*" verb="*" modules="StaticFileModule,DirectoryListingModule" resourceType="Either" requireAccess="Read" />
</handlers>