1

だから、私は巨大な.NETMVC3システムで働いています。同時に多くのユーザーがログインできます。HttpContextを使用して、「このキーでログに記録された人がまだいる」という方法を書いていました。しかし、これはベストプラクティスですか?DBをクエリする方が良いですか?

私が書いたもの:

     MvcApplication.SessionsLock();

        if (!force && MvcApplication.Sessions.Values.Any(p => p.ID.Equals(acesso.id_usuario.ToString(CultureInfo.InvariantCulture)) && p.Valid))
            throw new BusinessException("There's another user logged with this key. Continue ?");

     MvcApplication.SessionsUnlock();

私たちのDBを照会することができます..多分クッキー?任意のアイデアをいただければ幸いです

4

1 に答える 1

1

保管所

データベースは、この情報のための中央の永続的な場所を提供します。カスタム データ構造を使用するか、ASP.Net SQL セッションが要件を満たす場合があります (詳細は後述)。

ユーザーのセッションがいつ終了したかを常に正確に知る決定論的な方法はありません。たとえば、Session End イベントをリッスンすることはできますが、これはプロセス中のセッションに対してのみ発生し、まったく発生する保証はありません (たとえば、OS がクラッシュする可能性があります)。

とにかく、あなたが述べているように「巨大なシステム」を構築している場合は、インプロセス セッションを使用しないように設計しないでください。よりスケーラブルな SQL ベースのセッション状態について考え始めます (また、アクティブなユーザーの数を大まかに判断するのに十分な情報が得られる可能性があります)。

セッションの賛成/反対

セッションが良い習慣かどうか知りたいです。そのコードは機能します。しかし、ASP.NET MVC アプリケーションでのセッションの使用を推奨しない記事をたくさん読んでいます。

セッションが良いか悪いかについては、いつものように、それがどのように使用されるかによって異なります。適切に設計された MVC アプリは、状態を保持する必要なく、かなり複雑なビューを表示できます。これの一部は、AJAX (ページをリロードする必要がない) とエレガントなモデル バインディング (複雑な Request.Form を取得して完全なモデルに変換できる) の強力なサポートによるものです。

逆に、繰り返し使用される情報の小さなスニペットをセッション状態にすること、それを使用して機密データをクライアントに送信しないようにすること、それを使用してよりスムーズなユーザー フローを作成することなどには、本質的に問題はありません。

高度なセキュリティ シナリオでは、セッション固定攻撃に注意してください。セッションが適切でないか、手動でさらに保護する必要がある可能性があります。

注意すべきことの 1 つは、ASP.Net がセッションをロックすることです。これにより、複数のリクエストが一度に行われると、非常に現実的なパフォーマンスの問題が発生する可能性があります。通常、これは問題にはなりませんが、すべてがセッションを使用するコントローラーまたはエンドポイントからデータを要求する多数の AJAX ウィジェットを含むページを考えてみましょう。これらは互いに競合します(直接の経験)。

MVC は、Session への読み取り専用アクセスのみを必要とするコントローラーをマークする簡単な方法を提供します。これにより、問題が解消されます。ただし、Session に対する読み取り/書き込みアクティビティは引き続きシリアル化されるため、それに応じて計画してください。

ビジネス上の考慮事項

ビジネスの観点からは、セッションが期限切れになり、作業が停止したことを知ることは必ずしも重要ではありません (サイトの使用を停止したことや、セッションがタイムアウトしたことを気にしますか?) これは、最終変更のタイムスタンプを確認することで確実に対処できます。エンティティについて、ユーザーに警告します。警告、ロックしないでください。私の意見では、Web アプリケーションでのログイン/ログアウトに基づいてレコードをロックすることはめったに/決してすべきではありません (ロックされた状態でスタックするのは簡単すぎるため)。

于 2012-08-18T11:35:52.450 に答える