1

ASP.NET MVC のホット タオル SPA テンプレートを新しいプロジェクトとして検討していますが、ユーザー固有のデータをフィルター処理して保護する方法がわかりません。私たちのプロジェクトは、EntityFramework をベースにした ASP.NET MVC です。

それぞれが 1 つ以上の場所を持つさまざまな会社の販売情報を保存できるサービスを考えてみましょう。

  • 店長がログインすると、自分の店の売上のみが表示されるはずです。
  • 地域マネージャーがログインすると、自分の地域の店舗のみが表示されます。
  • CEO がログインすると、すべての店舗が表示されるはずです。

このビジネス ロジックは、クライアント側の Javascript 内で処理できますが、ブラウザの開発者ツールや Fiddler などを使用すると簡単にバイパスできそうです。HTTP 要求文字列を操作することで (OData ベースであるため)、社内の他のストアのデータを表示でき、他の会社のストアも表示される可能性があります。

クライアント側で言うといいでしょう:

var query1a = EntityQuery.from("Customers") .where("CompanyName", "startsWith", "A");

また、データベース全体ではなく、現在のユーザーに対してのみ結果を返します。

サーバーでこれを達成する方法に関する提案/例/チュートリアルはありますか?

この「フィルター」ロジックをセッション変数に格納することは理にかなっていますか? したがって、上記のクエリの場合:

(効果のあるもの)

[HttpGet] public IQueryable<Customer> Customers() { return _contextProvider.Context.Customers.Where(x=> x.CompanyID == Session['CompanyID']; }

4

1 に答える 1

1

必要なユーザーベースのフィルター処理効果を実現するために where 句を制限するようにサーバー側のクエリ メソッドを作成することで、まさに要求どおりに実行できます。

また、保存にも同じ制限を課したいと思うでしょう。クライアントを信頼することはできません。たとえば、店長が別の店の売上を保存できないようにしたいとします。

多くのビジネス ロジックが関係している可能性があります。Web API コントローラーには何も入れません。コントローラーが Web 要求とサーバー側のビジネス ロジックの間の仲介に専念できるようにしたいと考えています。他のクラスにカプセル化されたロジックが好きです。

これらの安全対策は、認証/承認スキームが用意されており、リクエストが処理される時点でユーザーとその権限がわかっているという前提から始まります。そのセキュリティ情報を渡すことができるはずです。

クエリ側では、クエリに最小限のフィルターを設定する 1 つ以上のリポジトリを使用できます。質問のために作成したクエリには正しい考えがあります。詳細はビジネス固有のものです。コントローラーから、1 つまたは複数のサポート リポジトリ クラスに移動するだけです。

ユーザーが保存するときにも同様のことを行います。BeforeSaveEntities メソッドでは、保存するすべてのエンティティを調べて、ユーザーがその変更を行う権限を持っていることを確認します。

これは簡単な論理ではありません。Breeeze フックは、そのビジネス ロジックを理解したときに適用するためにあります。

于 2013-11-01T07:33:07.667 に答える