2017-02-02 41 views
3

Iイベントログと呼ばれるテーブルは、このテーブルが既にユーザ接続に関するデータが含まれています:ユーザーがブラウザを閉じたときに、イベントを「ログアウト」

public ActionResult Login(string username, string password) 
{ 

} 
  • :ユーザーは、例えば、このアクションを呼び出すとき私は、ユーザーが既にデータベースに存在するか

  • そうであれば、私は、ユーザー セッションを設定するためにSession["user"] = usernameまたは FormsAuthentication.SetAuthCookie(username, true);を使用するかどうかをテスト

  • そして私は、イベントログテーブルにレコードを置く:ユーザーXがYの時

で接続されていたこれは正常に動作しますが、私はまた、ログアウトユーザーに関する情報を求めています。私はLogOffアクションと同様のことをすることができます、それはうまくいくだろうと思うが、大多数の人々はログオフボタンを使わず、ブラウザーを閉じるだけで、どのようにユーザーログオフイベントを実装することが可能ですユーザがブラウザを閉じるときの状況:ユーザXはY時に接続されていない。 Session_End()はこの状況では必要としません。

+0

ユーザーがログアウトしているかどうかを直接確認することはできません。しかし、おそらく、アプリケーションがユーザーが存在するかどうかをチェックさせることは可能です(しばらく)? SessionIdとのセッションが存在するかどうかを確認します。 (SessionIdをデータベースに保存する場合) – Arendax

+0

これをどのように実装することが可能ですか? SessionIdが存在するかどうか1時間ごとにチェックします。 –

答えて

10

ウェブテクノロジーの制限に同意する必要があります。ユーザエージェントにあなたの応答を送ったら、サーバはその要求で何が起こっているかを知る方法がありません。ユーザーは、ユーザーエージェントを正常に閉じることができます。 UAがクラッシュする可能性があります。ユーザーがインターネット接続を失う可能性があります。彼のコンピュータはクラッシュすることがあります。このすべては、クライアントがの場合でも、応答がになる前に発生します。これはあなたが扱っている環境です。それと戦う代わりにそれを抱きしめてください。

追跡ログオフがあなたにとって重要である場合は、あなたが使用する可能性のあるいくつかのテクニックがあります。

  1. は、セッションタイムアウトに依存しています。十分に短いタイムアウトを選択すると、セキュリティ要件を満たすのに十分な場合があります。私はこれが好ましい方法であると考えています。なぜなら、それは単純で実績があるからです。
  2. スクリプトを使用して、UAからサーバーにハートビートを送信します。 「ping」要求、長い呼び出しなどを使用できます。ただし、これに伴うパフォーマンスへの影響、サーバーへの要求数、および実装の複雑さに注意してください。
  3. SignalRなどの既存のフレームワークを使用して、クライアントとサーバー間の接続を確立し、クライアントにサーバーにチェックインさせます。これは、基本的に、手作業の少ない2番目のオプションです。

このすべては、あなたがユーザーのログオフまたは接続の損失を傍受が、できないだろう、クライアントはあなたが接続が(多くの可能な方法のいずれかで)中断されたことがわかっている応答を停止した場合。だから、これを "ユーザーログオフ"として登録するのではなく、 "ユーザーが切断"するように登録するべきです。

+0

私は2番目のアプローチが好きです。私はそれを実装できるかどうかを試してみます。私のコメントでは1時間だと言いましたが、現実には、私は約10人のユーザーしかいないので、パフォーマンスは心配しません。ユーザーは、アプリケーション内で多くのアクションを実行しますが、ステップごとに接続が解除されていれば、すべてが失われる可能性があります。それはなぜセッションのタイムアウトが大きすぎる必要があるのか​​〜18h、それは夜間にのみ期限が切れる。 –

+0

また、オプション3を検討してください。これは基本的にオプション2です。 – Sefe

1

これはどのように実装できますか?あなたは毎回行う場合

if(Session["UserName"] != null) { 
     /*Update the database with the last time that the user has performed a action*/ 
} 

:あなたはポストにユーザーのようなもので、新しいアクションを行い、最後の時間を行う場合のSessionIdは@Mehdi

が存在するかどうごとに1時間をチェックしますユーザーが新しいアクションに行くと、ユーザーがサーバー上でインパクトした何かを最後にしたことになります。最後に、ユーザーがログオフされていない(正確ではないがインジケータ)ことがわかります。

1

サーバー側では、ユーザーがいつブラウザを閉じるのかを知ることはできません。ただし、JavaScriptを使用してwindow.closeでトリガーし、AJAX呼び出しをサーバーに送信することができます。そのため、ユーザーが離れると記録されます。ただし、ユーザーがブラウザの設定を制御できるため、信頼性が低く、JSを無効にする可能性があります。それはおそらくあなたができる最高です。

+0

これを指摘してくれてありがとう、私は@Sefeの第2のアプローチを実装しながらそれを考慮に入れます。基本的には、あなたがする必要があるのは、javascriptを起動する必要性をユーザーに警告することです。また、サーバー側では、ユーザーからping要求がない場合は、ログアウトし、セッションをクリアしてイベントを記録します。 –

関連する問題