web-dev-qa-db-ja.com

ASP.NETでユーザーごとに1つの同時ログインのみを許可する

ASP.NET Webアプリケーションでユーザーごとに1つの同時ログインのみを許可することは可能ですか?

私はWebアプリケーションに取り組んでいます。このWebサイトでは、ユーザーごとに一度に1つのログインのみが許可されていることを確認しています。現在のユーザーがすでにログインしているかどうかを確認するにはどうすればよいですか?

この問題を処理できる適切なログイン方法を提案してください。この問題を処理するには、SQL Serverセッション状態を使用する必要があると思います。何を指示してるんですか?

私はそれに対する一つの解決策を考えました。次のようなことができます。

  1. ユーザーがシステムにログインすると、ユーザー列にセッションIDが挿入されます。 (データベースセッションを使用して、isexpired、expirdatedatetimeなどのすべてのセッション関連データを簡単に取得できるようにします)。

  2. 同じユーザーがもう一度ログインしようとすると、そのセッションID列が確認され、セッションがすでに期限切れになっているかどうかが確認されます。セッションの有効期限が切れていない場合、ユーザーはログインできません。

  3. ユーザーがログアウトするたびにユーザーセッションIDを更新します。

これが正しい方法かどうかを提案してください。

13
Hiren Dhaduk

以下を参照してください。

同じユーザーIDが複数のデバイスにログインしようとしている場合、他のデバイスのセッションを終了するにはどうすればよいですか?

そのままでは、.NETはこれをサポートしていません。ご存知のとおり、.NETでは同時ログインが可能です。

これとまったく同じ要件があり、上記のリンクで示されている非常に洗練されたソリューションを考え出しました。簡単に言うと、私の要件は、一度に1人のユーザーだけがログインするようにすることでした。同じユーザーIDが別の場所でログインしようとした場合、別のセッションIDで既存のログインをチェックすることにより、最初のログインのセッションを強制終了しました(これにより、ユーザーIDが彼らのコンピューター上のWebブラウザー[同じセッションID]は一般的ですが、別のコンピューターからのものではありません[異なるセッションID](たとえば、資格情報を盗んだ誰かが原因である可能性があります))。コードを変更することで、おそらくこれの動作を変更できます。つまり、すでにアクティブで使用中の最初のログインを強制終了するのではなく、2回目のログイン試行を防ぐことができます。

もちろん、必要なものに100%適合しない場合があるので、ニーズに合わせて自由に変更してください。

9
Mike Marks

ユーザーごとにキャッシュエントリを作成し、そこにセッションIDを保存できます。セッションIDは、ブラウザーセッションごとに一意になります。ログインページでは、ログインに成功したときにキャッシュエントリを作成できます。

if(Cache.ContainsKey["Login_" + username])
    // Handle "Another session exists" case here
else
    Cache.Add("Login_" + username, this.Session.SessionID);

(構文チェックなしでテキストボックスに入力されたコード。「疑似コード」を想定。)

次に、global.asaxでSession_Endにフックして、ユーザーのキャッシュエントリを期限切れにします。 これを参照 global.asaxイベントの場合。

if(Cache.ContainsKey["Login_" + username])
    Cache.Remove("Login_" + username);
5
Tombala

ユーザーが現在ログインしていることを示すフラグ列をユーザーテーブルに追加できます。

ユーザーがログインしようとしたときに、フラグがtrue(そのユーザーアカウントは既に使用されている)の場合はフラグをチェックし、新しいユーザーはログインを許可しません。フラグがfalseの場合、ユーザーはそのままログインできます。現在、アカウントは他のユーザーが使用していません。

がアクティブにログアウトしない限り、ユーザーが別の場所に移動したとき(別のWebサイトに移動したとき、またはブラウザーを閉じたときなど)を認識できないため、自動的にログアウトするセッションタイムアウトの種類を設定する必要があることに注意してください。指定された期間内に新しいリクエストがない場合のユーザー。

つまり、ユーザーがブラウザを閉じて、たとえばモバイルデバイスにログインしようとすると、指定したセッションタイムアウトが切れるまでログインできません。そのため、タイムアウトについては少し考えてみてください。ユーザーがすぐにログアウトされないようにしたい(長いページを読んでいる場合など)、ユーザーが忘れた場合にユーザーが別のデバイスに何時間もログインできないようにしたくない家を出る前にログアウトする。

2
Markus-ipse

アイデンティティシステムを使用している場合、このリンクは、複数のデバイスでシングルユーザーログインする方法に役立ちます。 Asp.Net Identityでの複数のログインの防止 私はAsp.net Mvcプロジェクトで正常に機能するように試みました。

1
Hamza Shafiq

ログイン認証情報はCookieに保存されるため、ユーザーがログインしているかどうかを確認するには、この情報をサーバーに保持する必要がありますは、データベースがWebガーデン間で唯一の共通の場所になる可能性があるため、データベースで推奨されますまたはWebファーム。

保持できるのは、テーブル上にあり、user Aがログインしているかどうか、ログアウトしていることを示すフラグ、最後のユーザーインタラクションでタイムアウトが発生しているなどです。

したがって、ユーザーAがログインしているとすると、そのユーザーのデータベースでフラグが開かれ、そのユーザーは現在ログインしています。また、再度ログインしようとすると、そのユーザーは除外されます。これを機能させるには、ユーザーにログアウトするように言うか、資格情報のタイムアウトと同様にタイムアウトを維持する必要があります。

1
Aristos

解決策はこのようにすることができます:

ログインテーブルGuidCodeに新しい列を追加します。
ステップ1:ログイン時に、データベースのGuidCodenullかどうかを確認します。
ステップ2:新しいGUIDによってGuidCodeを更新し、それをセッションに保存します。
ステップnullでない場合は、セッションからGUIDを取得し、データベースのGuidCode値と比較します。
ステップ4:同じ場合は、ログインを許可します。

0
Praveen Yadav