【发布时间】:2010-02-12 20:18:56
【问题描述】:
我会尽量做到具体。我继承了一个非常陈旧的 C++ ISAPI 过滤器,它保护了一个经典的 ASP 网站,并负责创建一个 HTTPModule 来直接替换它。
首先,我加入了 OnPreRequestHandlerExecute 事件。然后,我成功地重新创建了对原始 ISAPI 过滤器所做的存储过程的调用。这些调用返回一个状态代码,我将其放入 CASE 语句中,并根据状态代码设置一个“重定向”字符串变量 (sUrl)。例如 statusCode 15 会将 sUrl 设置为“/Session/Login.asp”。这一切都成功了。
下一步是页面的实际“重定向”。在 C++ 中,该模块执行以下操作:
Headers.push_back(HeadersList::value_type("url", "/Session/Errors/SecurIDRequired.asp"));
我正在尝试使用以下方法重新创建此功能:
HttpContext.Current.RewritePath(sUrl);
这适用于所有经典的 asp 页面 100%。当用户尝试访问“http://somedomain.com/Blah.jpg”时,问题就出现了。模块成功运行,设置了正确的 statusCode 15,并调用了 RewritePath 方法,但没有将 URL 重写到登录页面。同样的事情发生在任何非经典 ASP 页面。
所以我开始寻找其他选项而不是 RewritePath,并查看了 TransferRequest。这看起来很有希望,所以我将代码更改为:
HttpContext.Current.Server.TransferRequest(sUrl, true);
现在这会将所有请求的文件类型路由到登录页面,但会发生奇怪的事情。首先,我在 FireBug 中收到以下客户端错误:
... 其他一些围绕 jQuery 的 javascript 错误。我查看了 Net 面板,它成功加载了 jQuery 库,所以我对此不知所措(RewritePath 方法不会发生这种情况)。
最后,我尝试使用良好的旧 Server.Transfer 并收到此服务器端错误:
未找到请求类型“GET”的 http 处理程序
呸!我希望我的解释是足够的:)
我想我真正的问题是,完成我想要完成的事情的最佳方式是什么。我觉得 RewritePath 方法是最好的,任何提示将不胜感激。
干杯!
编辑:
web.config 中包含的处理程序如下:
<httpHandlers>
<remove verb="*" path="*.asmx" />
<add verb="*" path="*.asmx" validate="false" type="System.Web.Script.Services.ScriptHandlerFactory, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
<add verb="*" path="*_AppService.axd" validate="false" type="System.Web.Script.Services.ScriptHandlerFactory, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
<add verb="GET,HEAD" path="ScriptResource.axd" validate="false" type="System.Web.Handlers.ScriptResourceHandler, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
</httpHandlers>
【问题讨论】:
-
如果我可以改写您的问题,您问的是保护静态/非静态资源的最佳方法是什么,以便用户在尝试访问资源时始终需要登录?
-
BTB 你能说说你使用的是什么版本的 IIS 吗?
标签: c# asp.net web-applications httpmodule server-side