2

通常、通常のaspxファイルでは、次System.Attributeのようにページの先頭で使用できます。

    [AuthorizePage()]
    public partial class _Default : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
        }
    }

    public class AuthorizePage : System.Attribute
    {
         public AuthorizePage()
         {
            //do some stuff to authorize
         }
    }

また、ページが初期化される前に、属性のコンストラクターが実行され、ユーザーが現在ログインしていることを確認するために何らかの処理が行われます。それ以外の場合、属性コンストラクターはユーザーをログイン ページにリダイレクトします。

HttpHandler(ashxファイル)でも同じことをしたかったのですが、ashx ページでは属性が初期化されません。

[AuthorizePage()]
public class AjaxHandler : MuCustomClassBase, IHttpHandler, IReadOnlySessionState
{
     //The interface implementations and some other custom private methods
}

ashxこのページに AJAX 呼び出しを行います。これが属性が実行されない理由でしょうか? または、他に知っておくべきことはありますか?

最終的に、カスタム System.Attribute を ashx ファイルに対して実行する方法を知りたいです。

4

3 に答える 3

3

ASP.Net 認証を使用していると仮定すると、web.config の保護されたページのリストに .ashx を追加するだけで、IIS/ASP.Net が残りを処理します。

  <location path="AjaxRequests.ashx">
    <system.web>
      <authorization>
        <allow users="?" />
      </authorization>
    </system.web>
  </location>

自作の認証スキームを使用している場合はOnProcessRequest、そのメソッドで必要な認証をオーバーライドして実行し、必要に応じてリダイレクトできます。

于 2013-01-07T17:05:08.830 に答える
2

属性はそれ自体では何もしません。クラスに 10 個のランダムな属性を積み重ねることができますが、実際には何も起こりません。属性は、クラス/メソッド/プロパティに関するメタデータを提供するだけです。

メタデータを見てそれに基づいて動作するコードが必要です。カスタムAuthorizePageAttributeのそのようなコードを使用しているように見えるので、ハンドラーに対して実行しないか、 Page から派生していないクラスにそのような属性があることを期待していません。

問題を修正するには、カスタム属性を処理するものを見つけて修正する必要があります。同様のコードをハンドラーに直接追加する必要がある場合があります。

属性のコンストラクターのコードが、そのページへのすべてのリクエストでそのページクラスに役立つ何かを行うという事実は疑わしいと思われます-そのような属性はタイプインスタンスごとに1回作成されると思います. クラスのインスタンスごとに実行するために、属性のコンストラクターで重要なコードに依存することは、私には危険に思えます。

于 2013-01-07T17:04:14.960 に答える
1

まず第一に、Asp.Net MVC で ActionFilterAttribute を再発明しています。しかし、本当に属性を使用する必要があるかどうかを尋ねなければなりませんか? 継承モデルを使用することをお勧めします。簡単に説明しましょう。セキュリティ操作を実装する SecurePage : Page クラスがあるかもしれません。その後、派生ページに関連するセキュリティ コードを渡すことができます。

また、どうしても属性を使用する場合は、必要なハンドラーにルーティングするベース ファクトリ ハンドラーを作成して、ハンドラー メカニズムを交差させる必要があります。このハンドラーは、メディエーター オブジェクトのように動作する必要があります。

于 2013-01-08T11:01:34.760 に答える