ユーザーがASP.NETアプリを離れたときに監査する方法
質問
ASP.NETでは、アプリケーションを離れるユーザーを監査する方法を探しています。具体的には、ユーザーのセッションが何らかの理由で(必ずしもsession.abandonの呼び出しではないために)破棄/破棄された場合、SQL Serverの監査テーブルに「ログアウト」レコードを挿入したいと思います。
セッションのセッター/ゲッターを管理する「SessionHelper」クラスがあります。
Global.asaxのSession_Endにポストバックしようとしましたが、タイムアウトの期限が切れた後でも、このイベントは発生しませんでした。
SessionHelperクラスで「finalize」をオーバーライドして、クラスが破棄されたときにそこで実行しようとしましたが、そのイベントも発生しませんでした。
SessionHelperでIDisposableを実装してみますが、常に呼び出されるように、どこで呼び出すかわかりません。
ASP.NETアプリケーションを離れるユーザーを監査する適切な方法は何ですか?
ありがとう!
解決
Session_Endイベントは、InProcセッションがある場合にのみ発生します。 SQLまたは状態サーバーのセッション管理は、このイベントを起動しません。可能であれば、InProcセッションに戻ってこのイベントを使用します。
それ以外は、あまり良い解決策は得られません。 ASP.NETは、サーバー上のセッションの現在のリストを見る方法を提供していません(少なくとも、私はすでに質問をしているので、StackOverflowのユーザーが知る方法はありません)。それらが破壊されたときに確認してください。
次善の策は、「最後のアクセス時間」を持つことです。ユーザーのどこかに保存され、それを使用してセッションのタイムアウトを検出します。ただし、このようなジョブの実装は複雑です(たとえば、ユーザーがすばやくログイン/ログアウトするとログアウトイベントを見逃す可能性があります)...
ここで完璧な解決策はありません。
他のヒント
「適切な方法」について確認してくださいしかし、これは私が過去にそれをやった方法です。
「アクティブ」になりますデータベース内のユーザーレコードに関連付けられた日時スタンプ。ユーザーがページにアクセスするたびに、現在の時刻に更新されます。誰かが15分以内にページにアクセスしなかった場合、そのユーザーは「ログアウト」として記録されます。イベント、およびタイムスタンプはNULLに設定されます。
ユーザーがサイト/アプリを離れたときのセッションイベントを正しく動作させたとしても、せいぜいログアウトレコードはインテリジェントな推測になります。使用するテクニックは、ユーザーがログインするときにログアウト時間をdbに入れ、システムを使用する将来の時間でレコードを更新し続けることです。最近作成したセッションテーブルの一般的なスキーマを次に示します。
[Id] [Uid] [LoginInOn] [ExpiresOn]
1 johndoe 10/14/2008 10:47 10/14/2008 11:07
この表では、ユーザーがアプリケーションと対話するときにExpiresOn列を更新し続けます(現在の時間+ 20分)。 ExpiresOnの後に対話しようとすると、20分間アイドル状態になり、新しいログインを強制します。レポートのために、現在の時間がExpiresOnより大きい場合、ユーザーがログアウトしたことを知っています。これよりも複雑になる可能性があります。たとえば、上記のセッションテーブルから、通常のプロセスでレポートテーブルにデータを移動します。これは単にセッションテーブルを小さく保つためです。多くのものがテーブルと対話するためです。