3

基本的に、FormsAuthentication_OnAuthenticateの反対のイベントを探しています。ユーザーがログアウトしたときにデータベースからいくつかの値を削除したい。Session_Endイベントに入れてみましたが、実行するまでにユーザーはもういなくなっているようです。

更新:特定のユーザーがいつ認証解除されたか(つまり、セッションタイムアウトが原因)を判断できない場合、現在認証されているすべてのユーザーのリストを取得する方法はありますか?可能であれば、Session_Endで、現在認証されているユーザーに関連付けられていないレコードをDBから削除することができます。

4

4 に答える 4

2

Session_End は、起動することが保証されていません。たとえば、InProc セッションを使用していない場合、まったく起動しません。アプリケーションがリサイクルまたは停止すると、再び起動しなくなります。

最善の策は、多くの場所から呼び出すことができる共有メソッドにこのコードを含めることです。

  1. LoginStatusコントロールでは、LoggingOutイベントを設定できます。そこでメソッドを呼び出して、ログアウトする人を適切に処理します。
  2. InProc セッションを使用している場合は、Session_End イベントで、既にログアウトしているかどうかを確認してください (ご覧のとおり)。
  3. InProc セッションを使用していない場合は、もう少し工夫が必要です。おそらく、(Greg が述べたように) 最後にアクティブな時間がセッション タイムアウトよりも古いユーザーを通過してクリアする (おそらく、Session_Start で発生する) イベントを時々発生させることを検討してください。

残念ながら、Membership クラスはいくつかの有用な詳細を提供しますが、すべてではありません。

GetNumberOfUsersOnline

これは、「現在アプリケーションにアクセスしているユーザーの数を取得します」。-素晴らしいですが、ユーザーを獲得する唯一の方法は次のとおりです。

GetAllUsers      // Gets all the users from the storage provider (can be paged)
FindUsersByName
FindUsersByEmail

残念ながら、これらのどれにも、カウントに従って「アクティブなユーザー」のみを返すプロパティはありません。

MembershipUser のメンバーを見ると、「IsOnline」プロパティはなく、LastLogonDate と LastActivtyDate のみです。Web の切断された性質のため、これはおそらくあなたが得ようとしているのと同じくらい良いものです。

于 2009-01-26T20:55:24.017 に答える
0

ボタンやリンクなどをクリックしてログアウトしてもらうと思います。同じイベント/ブロックにコードを入れてみませんか。FormsAuthentication.SignOut()呼び出しを行った場所の近く。

于 2009-01-26T17:49:46.937 に答える
0

Global.asax には、セッションの有効期限が切れたときに実行することができる Session_End ハンドラーがあります。

これがあなたが望むものかどうかはわかりません。セッションと認証は 2 つの異なるものです。認証技術が FormsAuthenticationTicket を (Cookie 内で) ユーザーに提供しており、そのチケットに有効期限がある場合、認証の有効期限はこのチケットによって制御されます。サーバー上で積極的に管理されることはありません。ユーザーがチケットを作成する各リクエストが提供され、サーバーはユーザーがまだ認証されているかどうかを判断します。

要するに、ユーザーのセッションがいつ期限切れになるかを検出することはできますが、両方の有効期限の値が同じでない限り、認証がいつ期限切れになるかを判断できない可能性があります。

于 2009-01-26T18:11:52.927 に答える
0

SQL プロバイダーを使用している場合、aspnet_Users テーブルには "LastActivityDate" 列があります。それをフォーム認証のタイムアウト値と比較すると、間違いなくログインしていないユーザーのリストが表示される可能性があります。ユーザーが「ログアウト」リンクを使用して手動でログアウトすると、カウントは低くなります。

于 2009-01-26T18:37:02.393 に答える