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