3

私の ASP.NET MVC4 アプリケーションでは、フォーム認証を使用しています。アプリ内の 1 つのビューは、jQuerypost()呼び出しを介して文字列データを取得する必要があります。文字列を返すアクションを書きました。フォーム認証チケットの有効期限が切れるまで、すべてが正常に機能します。有効期限が切れた後、文字列アクションへの AJAX 呼び出しは次のようになります。

  • アクション内のコードは実行されません
  • アクションは 401 ではなく HTTP 200 を返します
  • このアクションは、ログイン ビューの HTML を文字列として返します。
  • 401 ではなく 200 ステータスが返されたため、コントロールは最終的jqXHR.done()jqXHR.fail()

これは予想される動作ですか?アクションが 401 を返すようにすることはできますか? または、これを処理するために他にすべきことはありますか?

4

2 に答える 2

5

コードを Application_EndRequest() に入れてもうまくいきませんでした。これが私の場合に機能するものです:

    protected void Application_BeginRequest()
    {
        HttpRequestBase request = new HttpRequestWrapper(Context.Request);
        if (request.IsAjaxRequest())
        {
            Context.Response.SuppressFormsAuthenticationRedirect = true;
        }
    }
于 2013-11-12T15:53:00.260 に答える
0

はい、これは予想される動作です。

Asp.Net 4.5 では、HttpResponse.SuppressFormsAuthenticationRedirect プロパティが追加されました。ただし、デフォルトの動作は依然としてログイン ページへのリダイレクトです。MSDN から:

デフォルトでは、フォーム認証は、ログイン ページにリダイレクトするために、HTTP 401 ステータス コードを 302 に変換します。これは、認証は成功するが承認が失敗する場合や、現在の要求が AJAX または Web サービス要求である場合など、特定のクラスのエラーには適していません。このプロパティは、リダイレクト動作を抑制し、元のステータス コードをクライアントに送信する方法を提供します。

このプロパティを使用するか、この回答から次の回避策を試すことができます。

protected void Application_EndRequest()
{
     if (Context.Response.StatusCode == 302 && Context.Request.Headers["X-Requested-With"] == "XMLHttpRequest")
    {
        Context.Response.Clear();
        Context.Response.StatusCode = 401;
    }
}

または、次の質問と回答をご覧ください:フォーム認証: ログイン ページへのリダイレクトを無効にし、401 を返すのに適した方法を選択してください。

于 2013-11-04T21:31:45.473 に答える