2011-07-13 6 views
6

私はカスタム認証、監査、プロファイリングの作業を行う必要のあるGlobal.asxファイルを持っています。これは、SAMLベースのSSOシステムをサポートし、通常の.Net認証(SAMLまたは複合認証をサポートしない)をオーバーライドする必要があるために必要です。0120 .js,.css.pngなどApplication_BeginRequestの間に静的ファイルを確認しますか?

カッシーニ/ 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経由でルーティングされますが、これは通常は良いことです。しかし、異なるハンドラはまだ異なるファイルタイプを扱います。特に、私は静的ファイルハンドラがあなたが確認する必要があるものだと信じています。 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で要求が静的であるかどうかを判断することはできません。ハンドラはRouting Moduleがハンドラを変更する可能性があり、このモジュールは常にApplication_BeginRequestの後に実行されるためです。私の提案は、ASP.NEtルーティングエンジンが使用する同様のコードを使用することです。

関連する問題