0

最終的に、カスタム属性をチェックするために、リクエストを処理する前に、リクエストを処理する webmethod への参照を取得しようとしています。

現在、リクエスト パスをプロジェクトの名前空間に追加し、.asmx 拡張子を削除し、スラッシュをドットに置き換えることで機能しています。ただし、これは、クラスの名前空間の階層がリクエスト パスの階層と一致していることを前提としており、そうすべき理由はありません。

ファイルを開いて解析する以外に、asmx ファイルへのリクエスト パスを指定して、内部のクラス タイプまたは内部のクラス タイプの名前への参照を取得する方法はありますか?

.NET はかなり新しいので、私がやっていることはばかげているかもしれません。しかし、いずれにせよ、私は答えに興味があります:)

編集: これは私のプロジェクトではなく、ASP.NET 3.5 および asmx Web サービスの使用にロックインされています

編集: 目的は、すべての webmethod に認証コードを追加することなく、特定の webservices が認証されていないユーザーによって実行されるのを防ぐことができるようにすることです。私のアイデアは、webmethods でそれらを public としてマークするカスタム属性を使用することでした。これらのみが、認証されていないユーザーによって実行されるカスタム HTTP モジュールまたはハンドラーによって許可されます。ユーザーのタイプはセッションに保存されます。

4

1 に答える 1

1

まず第一に、asmx は現在レガシー テクノロジと見なされているため、WCF Web サービスに切り替えることをお勧めします ( MSDNを参照)。WCF のパイプラインには、目標を満たす拡張ポイントがいくつかあります。

ハック ソリューションの 1 つは、asmx ファイルに独自のハンドラーまたはハンドラー ファクトリを配置し、WebServiceParser.GetCompiledTypeメソッドを使用して実際の asmx サービス タイプを取得し、属性を検査することです。その後、WebServiceHandlerFactory.GetHandlerを使用して実際のハンドラーを作成し、リクエストを実行できます。

おそらく、誰かがより良い解決策を提供できるように、カスタム属性で何をしたいのかを説明する必要があります。

編集: asmx またはディレクトリ全体を保護する場合は、組み込みの認証を使用して簡単に行うことができます。たとえば、次のようになります。

<location path="secure.asmx">
 <system.web>
   <authorization>
     <allow users="*" />
     <deny users="?" />
   </authorization>
 </system.web>
</location>

これにより、すべての認証済みユーザーにアクセスが許可され、匿名ユーザーは拒否されます。

Web メソッド レベルで詳細な制御が必要な場合は、ロジック全体をヘルパー メソッドEnforceSecurity(asmx のベース Web サービス呼び出しの静的メソッドまたはインスタンス メソッド) に配置し、関連する Web メソッドでヘルパー メソッドを呼び出すことをお勧めします。カスタム属性でメソッドを装飾する代わりに、メソッド呼び出しを挿入します。

于 2011-07-06T05:01:01.597 に答える