2012-02-09 12 views
5

ASP.netサイト(.NET 4、EF、jQuery Ajax、SQL Server 2008 R2を使用)を開発しています。このサイトでは、私はmulti-loginを防ぎたいです。私はあなたが既にログインしているので、あなたがサイトにログインすると、別のブラウザまたはコンピュータから再度サイトにログインできないことを意味します。ユーザーが複数のセッションに自分のサイトにログインするのを防ぐにはどうすればいいですか?

私はアイデアを植え、私のサイト上でそれを開発したが、それは問題を抱えていると私はここに

を質問をすることを決定し、その問題は、私は、このようなSQL Serverのテーブル持っているので、それは次のとおりです。

UserId = The Id of logged in user 
Key = Session.SessionId 

またWH実行し、このテーブルからレコードを削除するためのコードがある:ユーザログがサイトに、私はこのように、このテーブルに行を挿入

Id  [int]   NOT NULL IDENTITY(1,1) //PK 
UserId [int]   NOT NULL     //Relation to User table 
Key  [nvarchar](50) NOT NULL     //Unique 

  1. ユーザーは、すべてがちょうど、正しいと完璧な作品

    global.asax

Session_Endイベントでそのアカウント
  • からログアウトしよう:アン

    問題:ユーザーがブラウザを閉じますその行は削除されません(私は彼がブラウザを閉じると、そのテーブルの行はSession_Endイベントで削除されると思ったが、それはなかった!!!)

    どうすればよいですか?この問題の解決策はありますか?私の戦略を変えなければならないのか、それとも解決策があるのだろうか?

    ご迷惑をおかけして申し訳ありません。

    自分自身私はASP 会員を使用して、私のユーザーを管理していない:私は英語

    に任意のアイデアがUPDATE1

    よろしく

    Foroughi

    役立ちます新しいですUPDATE2:私はを使用します。InProc mo私のセッション状態のために20分のタイムアウトで

  • +6

    ユーザが新しいログインをしたときに既存のセッションをログアウトする方が簡単ですか?これは、ユーザーが別の場所(ホーム/仕事など)でログアウトするのを忘れた場合にも、より実用的です。 –

    +0

    @marc_sありがとう、ありがたいです。 –

    +0

    @AliForoughi:問題ありません。質問はまだ明確で完全に理解できます。 –

    答えて

    2

    ブラウザが閉じたときにSession_Endイベントが発生せず、サーバが特定の時刻にユーザからリクエストを得ていないときに起動します(デフォルトで20分)。つまり、Session_Endを使用してユーザーを削除すると、ブラウザを閉じた後20分間はログインできなくなります。

    2つの代替戦略はもちろんこれが唯一まだユーザーならば動作します(あなたは、ユーザーがページを離れるときにサーバーにログアウト要求を送信するために、ブラウザにonunloadイベントを使用することができます

    1. を気にしていますネット接続性を有する)。 onunloadイベントは、ページをリロードするときにもトリガされるため、イベントを使用する理由を追跡する必要があります。

    2. ユーザオブジェクトの最後のリクエストの時刻を保持します。こうすることで、ユーザーの活動状況やサイトから離脱した可能性を判断できます。たとえば、2分間何もしないユーザーを見つけてログアウトします。

    EDIT:コメントで上昇最終点として。あなたの要件を 'として表示するのではなく、1つのログインしかできないので、すでにログインしている場合はログインを許可しません。'あなたは 'に変更することができます。新しいものが作成されました。 '

    このようにして、アカウントルールごとに1つのログインセッションを維持しながら、より強力な強制方法を提供します。

    +0

    私は自分の質問を更新します、どう思いますか? –

    +0

    私は最初のものが十分ではないと思うが、良いと私はそれに感謝の男:) :)で働くだろう2番目の方法は、 –

    +1

    方法は、両方の世界の最高を得るために組み合わせることができます。 –

    1

    あなたが持っている問題は、どのように/状態を保存するかとは別に、ユーザーがセッションを残してログアウトしないことがあるということです。

    1)ユーザがログアウトしたとき、またはセッションが終了したときに状態を変更する(ケースを削除する)(n分後にセッションが終了する場合は、web.configおよびglobal.asaxを参照してください。イベントハンドラ)

    2)ユーザが2回目にログインしようとすると、前のセッションをログアウトするオプションを提供します。

    +0

    私は私の質問を更新します、どう思いますか? –

    0

    私はあなたが優しさを試すべきだと思います。このような:

    テーブル構造:

    ID 
    UserID 
    Flag 
    

    ユーザーがあなたのテーブルを更新し、あなたにログインし、または とにフラグを設定したとき、彼はログアウトに設定されている場合または

    ユーザーがブラウザを閉じたときに、彼をログアウトするかどうかを決定する必要があります。そうならば - あなたはのSession_Endとしてこのイベントをキャッチし、自分で彼をログアウトし、メッセージングシステムとしてデータベースを使用していない または

    2

    ファーストをオフにテーブルを更新します。それは災害のレシピです。

    あなたがしなければならないことは、ログインしたユーザーIDとそのアプリケーションの最後の処理時間を保持する辞書を持つことです。また、2〜5分おきにサーバーにpingを実行するすべてのページにスクリプトを追加します。

    pingを受信したら、ユーザーIDの最新の活動時間を更新し、「タイムアウト」したユーザーIDを削除します。

    +0

    災害?うわー、あなたは良いアイデアだと思うよ、私はそれでおかげで、おかげで:) –

    +1

    一般的にメッセージングのためにデータベースを使用することは悪い考えである理由は、それは非常に非効率的です。この場合、アプリケーションのストレージを使用することができます。また、他の状況では、通信を適切に行うために複雑なシステムを実装する必要があります(たとえば、イベントに頼る代わりに定期的なチェック、定期的なクリーンアップ、メッセージが読み込まれたかどうかの確認、キューイングなど)。これらのメカニズムは、通常、適切なプロセス間通信フレームワークで実装されます。 – linkerro

    +0

    "イベントに頼るのではなく定期的なチェック"?はい、私はあなたを持って、それは悪い考えではありません、ありがとうリンカロ。私は、DBの代わりにアプリケーションの状態でセッション情報を保存し、最後のアクティビティを保存することを意味すると思います。 –

    関連する問題