2010-11-22 5 views
0

資格でログインするための機能を備えたWebアプリケーションがあります 重要な要件は、一度ユーザーがログインすると、他のシステムや同じシステムの別のブラウザからもログインできないことです。 次のようなmssqlベースのソリューションです: "Is_Loggedin"は、データ型が "bit"の列としてテーブルに保持されています。ユーザーがログインすると、誰かが再度ログオンしようとするとフラグが "1"に設定され、システムはエラー "The user is already logged in"を表示しています ユーザーログアウトビットが "0" しかし、このロジックは、次のシナリオ複数のログイン問題

に失敗している

問題のシナリオ:ユーザーはフラグが「1」であり、ユーザが、ユーザが

はですログアウトするシステムの問題とできないを取得するときや状況にロックされているブラウザを閉じ この要件を処理するためのより良いロジックがありますか?

+0

なぜWeb環境にこのような奇妙な要件がありますか? IMO Webアプリケーションはこれを処理できる必要があります。 – Steven

+1

おそらく、同じユーザーが同時に複数回システムにアクセスしないようにする必要があります。要件は、その奇妙なIMOのすべてではありませんが、Webユーザがシステムにいるとき、または残っているときに確実に検出することは不可能です。 – mellamokb

答えて

0

ユーザーがログインしている間に、ユーザーがログインしている30秒ごとにサーバーにpingを実行するAJAX呼び出しを行うことができます。AJAX呼び出しを最後に送信した日付/時刻の列Is_LoggedInおよびLast_LoggedIn 。それ以上の時間があった場合は、1分と言い、ユーザーが別のシステムからログインできるようにします。

セッションのタイムアウト期間(通常は20分)を超えてブラウザを開いたままにしておくと、問題が発生します。その後、次のリクエストでログアウトされますが、is_LoggedInが1に設定されているため、再度ログインすることはできません。ユーザーがまだ積極的に使用しているかどうかを追跡するため、ウェブサイトは実際にログアウトせずにウェブサイトを離れることができる多くの方法のため、非常に難しい問題です。

ユーザーが複数の場所にログインすることを避けることが絶対に重要な場合、ユーザーが新しい場所にログインすると、他のすべての場所が自動的にログアウトするように強制することもできます。

0

global_asaxのsession_endイベントで 'Is_Loggedin'フラグを0に更新できます。 session_endイベントは常にコールです。 session_timeoutが期限切れになったときに_endイベントを呼び出します。

0

global.asaxコードの背後に私はセッション終了のための均一があると信じています。その方法に縛り付けて、ユーザーのIs_LoggedInフラグを0に設定することもできます。ユーザーのセッションを追跡できるように、ユーザーをセッションキーに結びつける必要があります。

編集: また、セッションクッキーまたは通常のクッキーを使用すると、ユーザーがブラウザを閉じると役立ちます。 Cookieは、ブラウザウィンドウを再度開くと認証されます。しかし、これは、ユーザーが公共のコンピュータを使用している場合、潜在的なセキュリティ上の問題があります。

0

いつか非アクティブ(たとえば30分)後にユーザーをログアウトさせることができます。この方法で、ユーザーがログアウトせずにブラウザを閉じると、30分後に再度ログインできるようになります。

0

PankajとしてSession_Endを使用すると、ログアウト時にユーザーのビットが0に設定されていることを確認することを推奨します。

システム障害の問題は別の問題です。おそらく、これはトリックを行うことができます:ユーザーがログインすると、ユーザーのセッションIDをデータベースに格納します。ユーザーがログアウトしたら、セッションIDを消去します。ユーザーがリクエストするたびに、セッションIDがデータベースに格納されているものと一致することを確認します。そうでない場合は、セッションを無効にして、ユーザーがログアウトするようにします。

これが起こります。ユーザーがログインすると、別のブラウザでセッションIDが更新されます。ユーザーが最初のブラウザーウィンドウに戻り、何かをクリックすると、そのセッションは無効になり、ユーザーは自動的にサインアウトされます。