2011-07-13 24 views
6

我有一個Global.asx文件,需要做自定義驗證,審計和分析的東西。這是必需的,因爲它支持基於SAML的SSO系統,並且需要覆蓋正常的.Net身份驗證(它不支持SAML或混合身份驗證)在Application_BeginRequest期間檢查靜態文件嗎?

我不想將它解僱爲靜態文件,例如.js,.css,.png

在Cassini/WebDev和IIS7中它有。

我想要的是一些簡單的檢查,如(不存在,不幸),以識別靜態文件。

我意識到這會寫起來相當簡單,但它感覺像是必須已經存在的東西 - IIS已經爲靜態文件等應用了緩存策略。

我需要一個代碼解決方案,而不是IIS配置更改一個。

更新

這是我目前的解決方法:

/// <summary>Hold all the extensions we treat as static</summary> 
static HashSet<string> allowedExtensions = new HashSet<string>(StringComparer.OrdinalIgnoreCase) 
{ 
    ".js", ".css", ".png", ... 
}; 

/// <summary>Is this a request for a static file?</summary> 
/// <param name="request">The HTTP request instance to extend.</param> 
/// <returns>True if the request is for a static file on disk, false otherwise.</returns> 
public static bool IsStaticFile(this HttpRequest request) 
{ 
    string fileOnDisk = request.PhysicalPath; 
    if (string.IsNullOrEmpty(fileOnDisk)) 
    { 
     return false; 
    } 

    string extension = Path.GetExtension(fileOnDisk); 

    return allowedExtensions.Contains(extension); 
} 

這工作和足夠快,但感覺可怕的沉悶。如果我們添加新的靜態文件沒有想到,特別是依賴於擴展會容易出錯。

有沒有更好的方式,而無需更改IIS配置?

回答

0

您可能能夠檢查哪個處理程序正在處理請求。

在IIS6中只有.net文件,例如aspx被映射到一個處理程序。

在集成管道的IIS7中,一切都通過.net路由,這通常是件好事。不同的處理程序仍處理不同的文件類型。特別是我相信staticfilehandler是你需要檢查的。 httpcontext.handler屬性應該讓你弄明白。

您可以創建一個擴展方法來添加方法IsStatic ...

西蒙

+0

我意識到我可以編寫自己的實現(就像我在問題中說的那樣),但感覺就像重新發明輪子。 IIS和.Net已經知道這是靜態文件請求,所以應該有一種現有的方法來做到這一點。 – Keith

0

有幾個選項:

  • 添加authorizationelement和不拒絕那些路徑,你不需要任何身份驗證幷包含您的靜態文件
  • 您正在使用集成管道。關閉它在你的IIS 7
+0

爲了支持SAML SSO,我不得不完全覆蓋.Net的授權機制(這就是爲什麼我首先需要在'Application_BeginRequest'中進行大量工作),所以選項1出來了。此外,就像我在問題中所述,更改IIS配置不是一種選擇 - 我需要一個代碼解決方案。 – Keith

+0

對不起,應該已經讀完了。將更新。 – Aliostad

0

毫無疑問,你需要,因爲ASP.NET路由引擎使用此代碼來決定文件是否存在,以創建一個自定義擴展方法,

if (!this.RouteExistingFiles) 
{ 
    string appRelativeCurrentExecutionFilePath = httpContext.Request.AppRelativeCurrentExecutionFilePath; 
    if (((appRelativeCurrentExecutionFilePath != "~/") && (this._vpp != null)) && (this._vpp.FileExists(appRelativeCurrentExecutionFilePath) || this._vpp.DirectoryExists(appRelativeCurrentExecutionFilePath))) 
    { 
      return null; 
     } 
} 

您將無法使用上下文來決定請求在Application_BeginRequest中是否是靜態的。處理程序,因爲路由模塊可能會更改處理程序,並且此模塊始終在Application_BeginRequest後執行。我的建議是使用ASP.NEt路由引擎使用的類似代碼。