5

バックグラウンド:

仕事に戻って、セッションとフォーム認証のタイムアウトのデフォルトのスライド有効期限を使用する Web フォーム アプリに取り組んでいます。私の仕事は、ユーザーの非アクティブを追跡し、必要に応じて、セッションの有効期限、タイマー、およびセッションのタイムアウトを更新するためのボタンに関する警告を含むモーダル ウィンドウを表示することです (フォーム認証のタイムアウトも更新されます)。Button はマスター ページのイベントに関連付けられており、ボディは空です。(私は他の解決策を知っています)。

部分的に機能するソリューション:

私のアプローチは、マスター ページの Page_PreRenderメソッドを使用して Session と FormsAuthentication のタイムアウト値を取得し、それらを比較して、クライアントのブラウザーに小さい値 (または任意の値) を (他の必要なデータと共に) 渡すことでした。ブラウザでは、モーダルウィンドウのある特定の瞬間にタイマーで警告を表示し、すべて意図したとおりに機能します...つまり、ユーザーが何もしていないときです。

問題:

私たちのアプリには、更新パネルのあるページがたくさんあります。これらの更新パネルは、セッションに保存されているデータとやり取りして操作するために使用されます。ユーザーがこれらの更新パネルのいずれかで何かを行うたびに、セッション タイムアウトがスライド (再起動) します。(現実世界では) クライアント上でそれらを追跡することはできません。サーバー上でセッションの有効期限を追跡する方法が必要です。

やりたくないこと

すべてのページ、すべてのグリッドビュー、すべてのイメージボタンなどを調べて、クライアントイベントをバインドしてユーザーアクションを追跡したくありません。もっと欲しい...可能であれば、一般的で保守可能なソリューション。

私の考え:

有効期限が切れる前にセッションまたはフォーム認証の残り時間を追跡/確認できるようにしたい、またはそれらの値がリセットされた場合に通知されるようにしたいと考えています。そうすれば、モーダルウィンドウを警告付きで表示する必要がある瞬間について、クライアントに初期データを取得できます。その時点で、その時間が正しいかどうかを最初にサーバーに確認できるようにしたいと思います(おおよそ)または、クライアントの JavaScript データを更新し、セッションの有効期限が更新されてから警告ウィンドウが表示されるまでの時間を延長する必要がある場合...そして、ユーザー要求の傍受とフィルタリングについてはどうですか? それは役に立ちますか?

4

5 に答える 5

0

SQL Serverを介したセッション状態を検討しましたか?これにより、データベースを介してセッションを管理し、必要な有効期限情報を照会するオプションを開くことができます。このリンクをチェックしてください。またはこのリンク

于 2012-11-05T21:56:41.790 に答える
0

まず第一に、あなたの提案に感謝します。私は先週この問題を解決することができましたが、以前に投稿する時間がありませんでした...そして率直に言って、私は他の解決策に興味を持っていました。あなたが投稿して提案したすべての資料を必ず読んでください。有難うございます。

これが私がしたことです:

サーバー側:

Cookieを使用してセッションの有効期限を追跡しました。私の頭を悩ませたのは、非同期リクエストでもPageがライフサイクル全体を通過することでした。全体的なアイデアは、マスターページのPre_Renderイベントを使用して、すべてのリクエストに適切なCookieを設定することでし

UTC時間形式を使用していて、javascript時間形式に変換可能なミリ秒を計算していました。

 var tmpDate = new DateTime(1970, 1, 1);
 var nowUtc = DateTime.UtcNow;
 var tmpSpan = new TimeSpan(nowUtc.Ticks - tmpDate.Ticks);
 return tmpSpan.TotalMilliseconds;

これで、計算に必要なすべての時間、現在の時間、セッションの有効期限(Session.Timeout)時間、および警告の時間...そこからの基本的な計算ができました。

クライアント側:

まず、3つのCookieをすべて赤くして追跡を開始し、現在のサーバー時間を追跡するために2つの別々の変数を初期化しました。これらは両方とも、現在のサーバー時間の最初のCookie読み取りと同じ値に初期化されました。次に、setTimeout関数を使用して、毎秒Cookie(現在のサーバー時間)を読み取りました(jQueryプラグイン)。以前のCookieの読み取りからの現在のサーバー時間と最新からの現在のサーバー時間かどうかを確認していました読み取られたCookieは等しい(個別の変数)-そうすれば、要求があったかどうかがわかり、要求があった場合は、警告時間とタイムアウト時間について他の2つのCookieを読み取って更新し、警告ダイアログが開いた場合は閉じます。その後、現在のサーバー時間変数を等しくし、Cookieが読み取られるたびにそれらを比較し、そのうちの1つだけを更新します。また、すべてのsetTimeout呼び出しで、現在の時刻を取得しています

new Date().getTime();

これは、クライアントマシンで測定された現在のUTC時間を返します。いずれにせよ、私たちはクライアントが自分のマシンに有効な時計を設定しているという仮定に依存しています。その後、現在の時刻と警告時刻を比較しています。現在の時刻が警告時刻よりも「大きく」、タイムアウト時刻よりも「小さい」場合は、ポップアップを表示する必要があります。現在の時刻がタイムアウト時刻よりも「大きい」場合は、ログアウトしているユーザーの背後にあるマスターページコードのメソッドを呼び出す非表示のボタンをクリックします。これは、ユーザーがブラウザーで複数のタブを開いている場合でもうまく機能します。ユーザーが1つのタブでログアウトすると、ユーザーをログアウトしようとする他のすべてのページ(タブ)もログインページにリダイレクトされます。ユーザーが[OK]ボタンをクリックして自分の存在を確認すると、マスターページのコードビハインドで空のイベントがトリガーされます(非表示のaspボタンをクリックします)。これは、セッションを更新するのに十分です。これにより、Cookieが自動的に再送信され、すべてが意図したとおりに行われます。(スライディングセッションがある場合)。警告ウィンドウにタイマーを実装するのは簡単でした。メッセージと3つのスパンを持つモーダルウィンドウのdivを動的に作成しました。setTimeoutの反復ごとに、次のようにタイマーを設定していました。

  1. 現在のJavaScript時間から時間、分、秒を計算します
  2. 結果を変数に配置します
  3. 結果が10より小さい場合は、0(ゼロ)を付加します
  4. クラスごとに適切なスパンをターゲットにし(IE 8でIDに問題があり、一意のクラスを使用)、そのテキストプロパティを計算値に設定します$(obj).text(calculatedValue)

終わりのために

念のため、Cookieを読み取ってフロートとして解析する場合は、必ず確認してください。この特定の状況でのサーバープッシュテクノロジーの適用とWebソケットの使用法に興味がありますが、すべてのクライアントのサーバーでのセッションの有効期限を追跡して計算するのはやり過ぎだと思います。サーバーでのセッションの有効期限の追跡を要求したこと、これはクライアントでの追跡のように見えることを知っていますが、そうではありません...これらのCookieは追跡に必要なすべてであり、サーバーから取得されるので...それだけです。

于 2012-11-15T21:06:08.890 に答える
0

あなたが求めていることを正確に行うわけではありませんが、おそらくこのTimeout コントロールは、少なくともいくつかのインスピレーションを提供するでしょうか?

*更新:ブログには、有効期限をスライドさせてコントロールを実装し、それをどのように機能させたかについてのコメントがいくつかあります。

于 2012-11-15T19:25:43.100 に答える
0

IHttpModule を実装し、適切な HttpApplication イベントにアタッチして、その中で必要なことを行います。

于 2012-11-14T16:54:43.810 に答える