2

ASP.NET で、アプリケーションを離れたユーザーを監査する方法を探しています。具体的には、ユーザーのセッションが何らかの理由で放棄/破棄されたときに、SQL Server の監査テーブルに「ログアウト」レコードを挿入したいと思います (必ずしも session.abandon の呼び出しのためではありません)。

セッションセッター/ゲッターを管理する「SessionHelper」クラスがあります。

Global.asax の Session_End にポストバックしようとしましたが、タイムアウトになった後でもこのイベントが発生しませんでした。

SessionHelper クラスで「ファイナライズ」をオーバーライドして、クラスが破棄されたときにそこで実行しようとしましたが、そのイベントも発生しませんでした。

SessionHelper に IDisposable を実装してみますが、いつでも呼び出されるように呼び出す場所がわかりません。

ASP.NET アプリケーションを離れるユーザーを監査する適切な方法は何ですか?

ありがとうございました!

4

3 に答える 3

2

「適切な方法」に注意してください。ただし、これが私が過去に行った方法です。

データベース内のユーザー レコードに関連付けられた「アクティブ」な日時スタンプを保持します。ユーザーがページにアクセスするたびに、現在の時刻に更新されます。誰かがたとえば 15 分間ページにアクセスしなかった場合、そのユーザーは「ログアウト」イベントとして記録され、タイムスタンプは NULL に設定されます。

于 2008-10-14T15:48:30.627 に答える
2

Session_End イベントは、InProc セッションがある場合にのみ発生します。SQL または状態サーバーのセッション管理では、このイベントは発生しません。可能であれば、InProc セッションに戻り、このイベントを使用してください。

それとは別に、あまり良い解決策は得られません。ASP.NET は、サーバー上のセッションの現在のリストを確認する方法を提供していません (少なくとも、私が既に質問したので、StackOverflow のユーザーが知る方法はありません)。それらがいつ破壊されるかを確認します。

次善の策は、ユーザーのために「最終アクセス時刻」をどこかに保存し、それを使用してセッションのタイムアウトを検出することです。ただし、このようなジョブの実装は複雑です (たとえば、ユーザーがすばやくログイン/ログアウトすると、ログアウト イベントを見逃す可能性があります)...

したがって、ここには完璧な解決策はありません。

于 2008-10-14T15:59:26.517 に答える
1

セッションイベントが正しく機能したとしても、ログアウトレコードは、ユーザーがサイト/アプリを離れたときのインテリジェントな推測になります。使用できる手法は、ユーザーがログインしたときにログアウト時間をデータベースに配置し、システムを使用するときに将来の時間でレコードを更新し続けることです。最近作成したセッション テーブルの一般的なスキーマを次に示します。

[Id]  [Uid]    [LoginInOn]        [ExpiresOn]  
 1    johndoe  10/14/2008 10:47   10/14/2008 11:07  

このテーブルでは、ユーザーがアプリケーションを操作するたびに ExpiresOn 列を更新し続けます (現在の時間 + 20 分)。ExpiresOn の後にやり取りしようとすると、20 分間アイドル状態だったことがわかり、新しいログインが強制されます。レポートの目的で、現在の時間が ExpiresOn よりも大きい場合、ユーザーがログアウトしたことがわかります。これよりも複雑にすることができます。たとえば、上記のセッション テーブルから通常のプロセスでレポート テーブルにデータを移動します。これは、多くのものが対話するため、セッション テーブルを小さく保つためです。

于 2008-10-14T15:53:41.660 に答える