2

ロールベースのページアクセスセキュリティを実行するHTTPModuleがあります(取得したコードにセキュリティを後付けする必要があります)。

ある例では、Server.Transferで起動しないことに気づきました。

コードの抜粋は次のとおりです。

        ' move to target page
    Select Case eTransferMethod
        Case TargetPageTransferMethod.Redirect
            Page.Response.Redirect(strPage, False)
        Case TargetPageTransferMethod.Transfer
            Context.Handler = Me
            Page.Server.Transfer(strPage)
        Case TargetPageTransferMethod.None
            ' Do nothing
    End Select

ここで話しているのは、TargetPageTransferMethod.Transferの場合です。ページは.aspxページになります。

これで、AcquireRequestStateが他のServer.Transfer呼び出しでこのコードで起動されることがわかりました。実際、転送先のページのボタンがクリックされると、ポストバックで発生します。皮肉なことに、このページへの転送ではセキュリティコードがバイパスされますが、このページのキャンセルボタンがクリックされると、ポストバックへのアクセスが拒否されます。:eek:

コードベースの詳細を投稿しますが、非常に複雑で広大であるため、説明するのは悪夢です。

だから基本的に私は尋ねています' Server.Transferが呼び出されたときにHTTPModuleのAcquireRequestStateイベントが発生しない原因は何ですか?'

4

3 に答える 3

4

これを回避する方法は、System.Web.UI.PageHandlerFactoryクラスを継承するカスタムHttpHandlerを作成することです。

次に、Response.RedirectとServer.Transferの両方で、ページインスタンスが作成されるたびに呼び出されるGetHandlerメソッドをオーバーライドできます。

この新しいハンドラーを登録して「*.aspx」拡張子を使用すると、すべてのページで新しいハンドラーが自動的に使用されます。これにより、Server.Transferでカスタム認証を実行したり、依存性注入フレームワーク(MS Unityなど)を使用したりできます。

于 2009-12-08T16:39:21.847 に答える
0

これはクライアントからの別のリクエストであるため、ポストバックで呼び出されていることは理解できますが、Server.Transferは新しいリクエストを開始せず、実行を1つのページから別のページに転送します。

AcquireRequestStateイベントは、「ASP.NETが現在の要求に関連付けられている現在の状態(たとえば、セッション状態)を取得したときに」発生するため、ブラウザーからの最初の要求で発生しますが、サーバー転送では発生しません。サーバーは別の要求を受け取りませんでした。別のページを処理するように要求しているだけです。

重要なコメントは、HttpServerUtility.Transferドキュメントからのコメントです。

ASP.NETは、現在のユーザーがTransferメソッドによって配信されたリソースを表示することを許可されていることを確認しません。ASP.NETの承認および認証ロジックは、元のリソースハンドラーが呼び出される前に実行されますが、ASP.NETは、Transferメソッドによって示されるハンドラーを直接呼び出し、新しいリソースの認証および承認ロジックを再実行しません。アプリケーションのセキュリティポリシーで、クライアントがリソースにアクセスするための適切な承認を必要とする場合、アプリケーションは再承認を強制するか、カスタムアクセス制御メカニズムを提供する必要があります。

于 2009-12-08T15:31:01.033 に答える
0

Server.Transferは、宛先ページのHTTPパイプライン全体を再処理しません。宛先ページのHttpHandlerを呼び出すだけです。このため、以前のアプリケーションイベントが発生することはありません。

于 2009-12-08T15:32:13.297 に答える