クライアントにフォーム認証を使用して ASP.Net MVC サイトを構築しました。
最近、認証されたユーザーを 1 つのブラウザー セッションに制限するように要求されました。つまり、ユーザーが新しいブラウザー インスタンスを起動するか、元のブラウザー ウィンドウで新しいタブを開くと、元のブラウザー ウィンドウからログアウトされます。彼らは追加のセキュリティを主張します。私がこれにどのようにアプローチできるか知っている人はいますか?前もって感謝します。
5 に答える
個人的には、これがどのようなセキュリティをもたらすのかを正確に尋ねたいと思います。このような状態を維持することは、Web アーキテクチャに反するものであり、あなたとあなたのユーザーを悲しませるだけです。
この問題が発生した場合、私は次のことを行います。
- ユーザーのユーザー名をデータベース (LoggedOn テーブルなど) に保存します。
- ユーザーがログオンしたら、そのユーザー名が LoggedOn テーブルに既に存在するかどうかを確認します。
- ユーザーがまだログオンしていない場合は、ユーザー名と現在の時刻を含む行をテーブルに挿入します。それ以外の場合は、一度に 1 つのデバイスからしかシステムにログインできないことを知らせるメッセージをユーザーに提示します。
- ユーザーのセッションが期限切れになった場合、またはユーザーがログアウトした場合に、テーブル内の行を期限切れにして削除するロジックを含めます。
1 つのブラウザーまたはタブではなく、一度に 1 つのアクティブなビューと考えてください。または、このように表示するように顧客を説得します。
ブラウザー セッション (ASP.NET セッション) に対して常に一意の Cookie を発行し、発行された最新の Cookie への通信を有効にして、一度に 1 つのセッションのみをアクティブにすることができます。通信を禁止するか、エラー ページを表示することで、アプリを無効にします。そのためには、ユーザーが誰であるかを認識し、アプリに対して認証する必要があります。これはパズルの半分であり、ユーザーは自分のマシンで一度に 1 つのブラウザーだけでアプリを使用するように強制されます。
問題のもう 1 つの部分は、そのブラウザーの同じブラウジング セッションの一部であるウィンドウとタブを減らして、一度に 1 つのビューだけをアクティブにできるようにすることです。これを行うには、サーバーへのポストバック用に各ページのビューステートに一意のシーケンシャル ID を発行して、同じセッション状態を共有する他のページとは別にそのページを一意に識別することができます (そのページがブラウザ タブ、フレーム、または新しいウィンドウにあるかどうか)。など)。または、追跡可能な任意のコード。次に、セッション内でどのページがポストバックされているかを把握し、何らかの方法で通信をシャットダウンするか、エラーページを提供するなどして、他のページを禁止したり、以前のページを無効にしたりできます.
新しいブラウザー インスタンスまたは新しいタブは、ブラウザーの構成方法に応じて、同じ閲覧セッションの一部である場合とそうでない場合があります。たとえば、IE には、タブが新しいプロセスまたはセッションで開くか、セッションを共有するかの動作を設定できる設定が用意されていると思います。この機能に依存するブラウザー間で期待される一貫性が得られるとは限らないため、上記のように、プログラミング手順を実行して制御する必要があります。
ユーザーが同時に別の IP# から接続することを禁止するなどの追加の手順を実行できます。