2

アプリケーションが同じユーザーからの複数のアクティブなログインを許可しない機能に取り組んでいます。ユーザーが新しいマシン/ブラウザからログインすると、以前のログインは無効になり、ユーザーは古いマシン/ブラウザのログインページにリダイレクトされます。

これは、次の方法で実現でき
ます。1.ログインしたユーザーの一意のセッションIDをHttpApplicationStateオブジェクトに保存する
2.ユーザーがログインするたびに、このセッションIDがオブジェクトで更新されるため、常に最新のセッションIDが存在します。
3.このセッションIDはクライアント側でもCookieに保存されます
。4。クライアントが要求するたびに、このCookie値をアプリケーション値と比較し、異なる場合はユーザーをログアウトします。
5.すべてのリクエストでこのセッションIDを比較するために、イベントOnAuthenticatedのHttpModuleオブジェクトを作成しました。

私の質問は、ユーザーをログアウトしているセッションをどうにかして放棄できますか?

4

3 に答える 3

2

IRequireSessionStateを一時HttpHandlerに実装すると、現在のセッションが得られます。これが完全なソースを提供するSOの質問/回答です。

HTTPModuleからセッション状態にアクセスできますか?

于 2012-06-08T11:43:33.710 に答える
2

別の方法として、カスタムロジックを実装することで同じことを行うことができます。

  1. 現在ログインしているユーザーのテーブルを維持します。
  2. ユーザーが正常にログインするたびに、ユーザー名/userIdおよびsessionIdとともにこのユーザーの新しい行を挿入するだけです。
  3. このテーブルのすべての新しいログインのエントリを確認します。存在する場合は、前のセッションでユーザーをログアウトし、古いエントリを新しいsessionIdに置き換えます。存在しない場合は、#2を実行します。つまり、新しいエントリを作成します。
  4. ユーザーがログアウトするたびに、セッションを破棄している間、このテーブルから自分のエントリを削除するだけです。
  5. また、デフォルトのセッションタイムアウトを持つユーザーのエントリを削除します。

また

  • すべてのユーザーの永続的なエントリを持つテーブルを管理し、挿入/削除の代わりにuser_login (user_id, login_status, session_id)そのフィールド()を更新するだけで同じことができます。login_status (true/false) and session_id (String)

最初のアプローチでは、テーブル内の行数は少なくなりますが、挿入/削除操作が増加し、同じようにテーブルの一意のIDが非常に頻繁に増加します。

2番目のアプローチでは、更新操作の最初の原因としてDBに同等のヒットがありますが、行数はアプリケーションのユーザー数に等しく固定されます。

于 2012-06-08T13:44:13.937 に答える
0

HttpContext.Current.Sessionを使用し、HttpModuleからHttpContext.Current.Session.Abandon()を呼び出すことができます。これは、セッションオブジェクトの初期化後に呼び出されるイベント( HttpApplication.PreRequestHandlerExecuteなど)でSessionを使用することを前提としています。

于 2012-06-08T11:58:49.730 に答える