1

これは、特定のリクエストに対してフォーム認証を抑制するためのモジュールに関する投稿です。アイデアは、モジュールが web.config に登録されているため、リクエストごとにInit()呼び出されるということです。

public void Init(HttpApplication context) {
    context.PostReleaseRequestState += OnPostReleaseRequestState;
    context.EndRequest += OnEndRequest;
}

次に、リクエストが IIS パイプラインの終わりに近づくと、EndRequestイベントが発生し、次のコードが呼び出されます。

private void OnEndRequest(object source, EventArgs args) {
    var context = (HttpApplication)source;
    var response = context.Response;

    if (context.Context.Items.Contains(SuppressAuthenticationKey)) {
      response.TrySkipIisCustomErrors = true;
      response.ClearContent();
      response.StatusCode = 401;
      response.RedirectLocation = null;
    }
}

SuppressAuthenticationKeyコードの他の部分は先に呼び出され、で設定されていることを保証しcontext.Context.Itemsます。

これで、IIS ソース (調査用に入手可能) を入手できました。実装がFormsAuthenticationModuleあり、サブスクライブしEndRequest、その要求のハンドラーは、HTTP 401 コードで終了したすべての要求を忠実にリダイレクトします。

コードを見るだけでなく、このように動作することもわかります。これには何の量.RedirectLocation = nullも影響しません。

IIS でリダイレクトが抑制できない場合、そのコードはどのようにフォーム認証リダイレクトを抑制しますか?

4

1 に答える 1

1

結局のところ、これがこのことがどのように機能するはずなのかです。

EndRequest最初に FormsAuthenticationModule に対して起動し、そのイベント ハンドラーがリダイレクトを設定しますが、リダイレクトはすぐには実行されません。実際の効果は、応答で HTTP 302 とリダイレクト URL を脇に置くだけで、要求処理が続行されることです。次にEndRequest、抑制モジュールに対して起動し、抑制モジュールは以前に設定されたリダイレクトを、設定されていないかのようにクリアします。

そのため、最初からリダイレクトがなかったかのように、リクエストの処理が続行されます。

于 2013-02-20T05:14:44.003 に答える