1

私のアプリケーションでは、これが今までのセッションタイムアウトの処理方法です

<authentication mode="Forms">
    <forms loginUrl="~/Account/LogOn" timeout="20" />
</authentication>

今、私はクライアント側でセッションタイムアウトを処理したいのですが、このようなものです

<authentication mode="Forms">
   <forms loginUrl="showPopup();" timeout="20" />
</authentication>

それは可能ですか、またはこれを達成するための他の提案された方法はありますか?

編集

私は同じタイプの他の質問を訪問しましたが、彼らから本当の助けを得ることができませんでした.

4

2 に答える 2

2

私のアプリケーションでは、これが今までのセッションタイムアウトの処理方法です

これは、web.config でフォーム認証を定義する正しい方法です。

それは可能ですか

いいえ、申し訳ありませんが、javascript をloginUrl属性に入れても意味がありません。

またはこれを達成するための他の提案された方法

私が理解していることから、セッションの有効期限が切れた場合、JavaScript関数を使用してLogOnフォームを表示しようとしています。

サーバーへの 2 種類のリクエストを区別する必要があります。

  1. 標準の同期リクエスト (アンカー、フォーム、リダイレクトなど)
  2. 非同期リクエスト (AJAX - JavaScript を使用して実行)

サーバー側のどちらの場合でも、認証を必要とするアクションを[Authorize]属性で装飾して保護する必要があります。例えば:

[Authorize]
public ActionResult SomeAction()
{
    ...
}

サーバーを保護したら、フォーム認証 Cookie の有効期限を処理する方法、または単に匿名ユーザーがこのアクションを呼び出そうとする場合について考え始めることができます。

サーバーへの標準の同期呼び出しの最初のケースでは、フォーム認証モジュールが要求をインターセプトし、ユーザーが認証されていないか、セッションが期限切れになっている場合、ASP.NET は属性で定義したログオン ページに自動的にリダイレクトしloginUrlます。また、ReturnUrlクエリ文字列パラメーターとしてこのアクションに渡されます。このアクションは、ユーザーが最初に要求した URL を指し、まだ承認されていません。このパラメータを使用して、認証後にこのページにリダイレクトすることができます。

2 番目のケースは、ASP.NET が要求をログオン ページに自動的にリダイレクトするため、ユーザーが承認されておらず、サーバーが要求をログオン ページにリダイレクトしたことを AJAX 成功コールバック内で知る方法がないため、少し難しくなります。Phil Haack は、excellent articleAJAX リクエストのこのリダイレクトを防ぐ方法について書いています。今すぐこの記事を読んでください。

記事を読み、彼の 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>
于 2013-01-02T09:24:32.313 に答える
0

この構成領域は、サーバーがセッションの有効期限が切れた要求を処理しようとしたときに発生するサーバー側の動作を構成するためのものです。これは、ページに対するクライアント -> サーバー要求の結果です。クライアントは Web ブラウザーであり、サーバーから切り離された設計になっているため、必要なロジックを各ページ (おそらくメイン レイアウト テンプレート) に含めてから、AJAX 呼び出しをサーバーに対して繰り返し行う必要があります。ユーザーのセッション タイムアウト状態。ポップアップもクライアントで処理されます。

この構成の領域は、おそらく目標を達成するのに役立ちません。<forms>要素を完全に削除し、サーバーへの AJAX 呼び出しを使用して問題を解決することを検討します。

于 2013-01-02T09:09:05.230 に答える