簡體   English   中英

ASP.NET HttpModules和Server.Transfer / Server.TransferRequest / RewritePath問題

[英]ASP.NET HttpModules & Server.Transfer / Server.TransferRequest / RewritePath problems

我會盡量做到具體。 我繼承了一個非常過時的C ++ ISAPI過濾器,該過濾器可保護經典ASP網站的安全,並負責創建HTTPModule以直接替換它。

首先,我迷上了OnPreRequestHandlerExecute事件。 然后,我成功地重新創建了對原始ISAPI篩選器進行的存儲過程的調用。 這些調用返回一個statusCode,我將其扔到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中收到以下客戶端錯誤:

語法錯誤https://somedomain.com/JS/jQuery/jquery.js第2行

...一些圍繞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>

我不知道這是否是最好的方法,但是作為測試,下面的工作是否可行?

在您的HttpModule中:

private void Application_BeginRequest(Object source, EventArgs e)
{
    HttpContext context = ((HttpApplication)source).Context;
    HttpRequest request = context.Request;
    if(request.Url.ToString().Contains("blah.jpg"))
    {
        context.RewritePath("~/login.aspx?");
    }
}

聽起來好像IIS不會將對圖像的請求移交給ASP.Net,這是默認設置(IIS通常只提供圖像而不將其移交給Page或其他任何東西)。

您是否嘗試過在IIS中或使用web.config文件將映像擴展名映射到自定義處理程序?

伙計,很抱歉浪費大家的時間。

事實證明,底層數據結構存在一些問題(權限設置不正確)。 由於實現的安全模型的復雜性,我一定會一遍又一遍地錯過它,直到最終我意識到了這個問題。 我一定已經看了100次卻沒有意識到!

感謝您的所有答復,再次抱歉。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM