2

私たちが現在実装しているものはうまく機能しますが、もっと良い方法があるのではないか、完全に間違っているのではないかと心配しています。

当社のウェブサイトにログインすると、リクエストごとにAPIにリクエストを送信してユーザーの詳細を取得します。

例:ユーザー名、ImageUrl、役割/権限、メールアドレスなど

次に、このデータをBaseControllerに保存して、ビューページまたは他のユーザーがそのリクエスト中に表示できるようにします。

利点:
このようにすることは、ユーザーの権限/役割とその詳細がすべて最新であるという各リクエストを知っていることです!

欠点:
リクエストごとにまったく同じデータを取得する可能性が最も高く、その日までは詳細が変更されます。したがって、あなたはおそらく不必要な電話をかけるのですか?

ただし、これをすべて試した最初の方法は、すべてのデータにログインしたユーザーがCookieに保存される場合でした。これに関する問題は、ユーザーがログアウトすることがほとんどないため、Cookieに保存されているすべてのデータが頻繁に古くなることです。->古い役割/許可は厄介な問題です!!!

誰もがログインから古いデータをどのように回避しますか。

4

3 に答える 3

1

Cookie 内にクレームを保存するという最初のアプローチに戻ります。

実際にログイン時間が非常に長い場合は、Cookie を定期的に更新することで、請求が停滞するのを防ぐことができます。

フォーム認証を使用している場合はFormsAuthentication_OnAuthenticate、Global.asax でイベントをインターセプトし、Cookie を解読して管理し (こちら)、ユーザーと Cookie を最初に検証してから、refreshedDate と呼ばれる userdata プロパティのカスタム フィールドに対して簡単な条件付きチェックを実行できます。

最後の更新日または作成日が構成可能なウィンドウより後の場合は、データベースを呼び出して、データベースから請求データを更新します。最後に、refreshDate とクレーム データを更新し、Cookie を更新します。

アップデート

コメントの続きで…

リクエストごとにデータベースにヒットすることは珍しくありません。つまり、多くの本番システムで発生することがわかっています。多くの人は、MS-SQL データベースを使用してASP.NET セッション状態を使用していると思われます。通常、誰かのセッションを無効にし、アクセスを拒否し、すぐにログアウトするという実際のセキュリティが必要な場合に、私はそれを見てきました。

データベースが Web サーバーに対してローカルのネットワーク上にある場合、および/またはレイテンシーが許容できるほど低い場合、それは完全に実行可能なソリューションになる可能性があります。データベース クエリが最小限に抑えられ、パフォーマンスが完璧に調整されていることを確認し、ORM (該当する場合) をサイド スティーピングすることを検討し、生の SQL 接続を使用して物事を可能な限り高速化します。

データベースのレイテンシーが高い場合、もう 1 つの中間的な解決策はキャッシュです。RedisまたはMemcachedを使用してクエリの結果を格納し、アクセス許可が変更されたときにキャッシュを無効にします。しかし、キャッシュ ソリューションに必要なインフラストラクチャと運用サポートを追加することは明らかです。真剣な検討。

于 2012-12-19T09:11:30.530 に答える
0

他の提案に加えて、別のオプションは、ユーザーのデータが変更されるたびに、基になる役割/許可ストアからの通知メカニズムを使用することです。この通知を使用して、Webサーバーにキャッシュされたデータを無効にすることができます。これにより、ほとんどの場合、キャッシュされたデータが確実に返されますが、データが変更された場合にのみストアがヒットします。

基盤となるデータストアがSQLSerevrの場合は、のようなものを検討してSqlDependencyください。

これは明らかにより複雑なアーキテクチャですが、要件を満たし、努力/複雑さ/トレードオフの価値があるかどうかを言うことができるのはあなただけです!

于 2012-12-20T13:27:49.903 に答える
0

Cookie に有効期限を適用できます。そうすれば、それは停止し、ログインする必要があります。または、ユーザー ID を Cookie に保持し、プロファイル情報をセッションに保存します。セッションが終了すると、次にプロファイルが null かどうかがチェックされたときに、API に対して再度クエリを実行します。このように、より頻繁に更新されます。

于 2012-12-19T03:01:20.693 に答える