4

ASP.NETサイトがあります。ユーザーが2台のコンピューターから同じログインでログインすることを禁止したい。誰かがログインしていて、他の誰かが同じログインでログインしたい場合は、このユーザーがすでにログインしているというメッセージが表示されます。フォーム認証などはありません。「ログイン」ボタンでデータベースに接続し、ユーザーとパスワードが有効かどうかを確認します。

ユーザーがログインしたときにデータベースのステータスを更新し、他の誰かがログインしようとしたときに、このユーザーがすでにログインしているかどうかをデータベースにチェックインすると思いましたが、ユーザーがログインしていない場合はお勧めできません。 「ログアウト」ボタンをクリックしないでください。データベース内の彼が非アクティブであるというステータスは更新されません。

フォーム認証などを使用せずにこれを行う他の方法はありますか?

4

3 に答える 3

1

正直なところ、フォーム認証を使用してMicrosoftに詳細を処理させる方が簡単ですが、フォーム認証を使用しないように「挑戦」した場合の方法は次のとおりです。(他の方法もありますが、これは私が好きな方法です)。

  • ログイン時に、ユーザーのセッションCookieを作成します(たとえば10分)。このCookieには、ユーザーID、ログイン時間、および参照元のIPを格納するテーブルへのIDが含まれます。この情報もCookieに含めます(単純な暗号化を使用)。ページが読み込まれるたびに、Cookieを更新してさらに10分間継続し、データベースに対して資格情報を確認します。これは、ユーザーが10分ごとにWebサイトにアクセスしなかった場合、セッションがタイムアウトすることを意味します。これにより、ユーザーが別の場所からいつログインしていたかを知ることもできます。

補足:Windowsフォームにカスタム認証を使用する場合は、上記のほとんどすべてが自動的に処理されます。Windowsフォーム認証を使用すると、タイムアウトやCookie管理について心配する必要がなくなります。

于 2012-07-31T23:19:32.860 に答える
1

完璧な解決策はありません

この問題を確実に解決することはできませんが、近づくことはできます。正当なユーザーがこの制限に不満を感じるというエッジケースがあります。

あなたにできること

ASP.Netメンバーシッププロバイダーは、特定のユーザーが最後に表示された時刻、つまり、ユーザーが最後にログインしてページにアクセスした時刻を追跡します。同様の戦略に従うことができますが、ユーザーのIPアドレスと、おそらくブラウザーのユーザーエージェントにも注意してください。

短いウィンドウ(たとえば20分)内に同じログインクレデンシャルの2つの異なるIPアドレスやユーザーエージェントが表示された場合、それらは異なるデバイスからのものである可能性が高いと考えられます。

注意してください

私が言ったように、あなたが間違っているというエッジケースがあります。たとえば、モバイルデバイス上の誰かが頻繁に新しいIPアドレスを取得します。

于 2012-07-31T23:19:40.810 に答える
1

last_activity_timeログインしたユーザーがいずれかのページにアクセスするたびに更新されるユーザーファイルをデータベースに含めることができます。これで、現在の時刻と比較する30分(ユーザーがログに記録されていることが有効な期間)などのlast_activity_timeウィンドウを作成できます。必要なウィンドウ(30分)よりも時間差が大きい場合は、ユーザーを考慮します。非アクティブです

于 2012-07-31T23:19:47.510 に答える