0

フォーム認証を使用すると、非 ajax リクエストで応答コードは 302 リダイレクトになり、クライアント ブラウザはaccount/logonデフォルトのログイン ページなどにリダイレクトされます。

ただし、Ajax リクエストを行っていてログイン セッションがタイムアウトした場合、同様に ajax 呼び出しスレッド ハンドラに 302 リダイレクトが与えられ、etc. ページをリクエストし、それをオブジェクトのプロパティaccount/logonとして返します。明らかに、このような動作は望ましくない結果をもたらします。返されたログイン ページは、通常は ajax 呼び出しで要求する部分的なビューではなく、レイアウト ヘッダー、ナビゲーションなどのレイアウト要素を含み、JavaScript はこの HTML をターゲット要素に挿入し、フル レイアウト効果内のフル レイアウト。responseXMLjqXHR

私は現在/account/logon、リクエストがajaxリクエストであるかどうか、アクションメソッドでサーバーをチェックするだけでこれを解決することを考えています。そうであれば、ログオンフォームになる部分ビューを返します。これは多かれ少なかれ機能しているように見えますが、セッションがタイムアウトしたときに、認証された要求に対して返される通常のコンテンツ データとログオン部分ビューのデータを区別できるように、応答コードを設定することもできません。おそらくハックな方法でそれを行うことができますが、この問題に取り組むための正しい/従来の方法を知りたかっただけです。おそらく、jqXHR の textStatus プロパティを使用してログオン フォームであることを通知し、ステータス コードを使用してこれを行う必要はありません。ASP.NET の jqHXR.textStatus の値をどこに設定するのですか?

今私はしようとしています:

public ActionResult LogOn()
{
    bool isAjaxCall = string.Equals("XMLHttpRequest", Request.Headers["x-requested-with"], StringComparison.OrdinalIgnoreCase);
    if (isAjaxCall) { Response.StatusCode = 409; return PartialView("LogOnForAjaxView"); }

    else return View();
}




$.post(path, function (data, textStatus, xhr) {

         if(xhr.status != 409)    $('#content-wrapper').html(data);

         else // Present the form html, overlay it over the page content etc.                 
         }
4

1 に答える 1

0

ajaxが呼び出しているサーバーメソッドで、セッションがアクティブかどうかを確認し、そうでない場合は例外をスローします。この例外は、ajax リクエスト JavaScript のエラー コールバックで処理します。

于 2013-06-27T01:34:43.293 に答える