私のアプリケーションでは、これが今までのセッションタイムアウトの処理方法です
これは、web.config でフォーム認証を定義する正しい方法です。
それは可能ですか
いいえ、申し訳ありませんが、javascript をloginUrl
属性に入れても意味がありません。
またはこれを達成するための他の提案された方法
私が理解していることから、セッションの有効期限が切れた場合、JavaScript関数を使用してLogOnフォームを表示しようとしています。
サーバーへの 2 種類のリクエストを区別する必要があります。
- 標準の同期リクエスト (アンカー、フォーム、リダイレクトなど)
- 非同期リクエスト (AJAX - JavaScript を使用して実行)
サーバー側のどちらの場合でも、認証を必要とするアクションを[Authorize]
属性で装飾して保護する必要があります。例えば:
[Authorize]
public ActionResult SomeAction()
{
...
}
サーバーを保護したら、フォーム認証 Cookie の有効期限を処理する方法、または単に匿名ユーザーがこのアクションを呼び出そうとする場合について考え始めることができます。
サーバーへの標準の同期呼び出しの最初のケースでは、フォーム認証モジュールが要求をインターセプトし、ユーザーが認証されていないか、セッションが期限切れになっている場合、ASP.NET は属性で定義したログオン ページに自動的にリダイレクトしloginUrl
ます。また、ReturnUrl
クエリ文字列パラメーターとしてこのアクションに渡されます。このアクションは、ユーザーが最初に要求した URL を指し、まだ承認されていません。このパラメータを使用して、認証後にこのページにリダイレクトすることができます。
2 番目のケースは、ASP.NET が要求をログオン ページに自動的にリダイレクトするため、ユーザーが承認されておらず、サーバーが要求をログオン ページにリダイレクトしたことを AJAX 成功コールバック内で知る方法がないため、少し難しくなります。Phil Haack は、excellent article
AJAX リクエストのこのリダイレクトを防ぐ方法について書いています。今すぐこの記事を読んでください。
記事を読み、彼の NuGet ( ) をインストールしたので、AJAX 要求に jQuery を使用していると仮定すると、グローバル イベント ハンドラーInstall-Package AspNetHaack
をサブスクライブできます。.ajaxComplete()
このハンドラー内でサーバーの応答コードをテストできます。コードが 401 の場合は、ユーザーが承認されていないことを意味します。したがって、それに応じて行動できます:
<script type="text/javascript">
$(document).ajaxComplete(function(event, xhr, ajaxOptions) {
if (xhr.status == 401) {
// the AJAX request failed because either the user was not
// authenticated or his session expired. So here you could
// do whatever you want. For example you could redirect him
// to the loginUrl defined in your web.config file:
window.location.href = '@FormsAuthentication.LoginUrl';
// you also have the possibility to show this logon form
// inside a popup or render it inline inside the page,
// by sending an AJAX request to this action and retrieving the
// corresponding partial
}
});
</script>