breeze/odataクエリは、データへのセキュリティアクセスに重大なリスクをもたらします。たとえば、制限エンティティ(R)に関連する制限のないエンティティ(U)があるとします。私は、Rを問い合わせるためにエンドポイントを公開することはありません。関連するRを含めずに、私のクライアントにUを問い合わせるように書くつもりです。しかし、悪意のあるクライアントが関連するRを要求する可能性があります。ロールベースのセキュリティをodata/breezejsクエリの結果に適用するにはどうすればよいですか?
どうすればよいですか?
私にはいくつかのアイデアがあります。しかし、私はまだ彼らが動作するかどうかを言うことができるようにそれらを実装することができませんでした。なし - レス、ここに私の考えです:
1)は、各結果のエンティティを点検 - クエリが実行された後ではなく、結果の前にクライアントに送信されます。しかし、実行とクライアントへの送信の間にチェックコード(コールバックまたは何かを介して)を挿入する方法はわかりません:(
2)スマートをPOCOに追加して、制限されたエンティティとプロパティをチェックしますユーザーの役割について説明します。たとえば、代わりの:
private string _p;
public string P
{
get
{
if (UserRoles.HasAny("role-a","role-b"))
return _p;
return null;
}
set { _p = value; }
}
POCOはダムことになっているので、不快なようだ:
class MyThing{
public string P {get;set;}
}
私はこのような何かを持っていると思います。 POCOは、どこかから、おそらくHTTPセッションのユーザーの役割を読み取ることができる必要があります。私はそれがどのようにうまくいくか分かりません。
私は、次の質問/回答を読んだが、彼らは私を助けていません。 roles based security in breezejs and EF6は、 How is breeze.js handling security and avoiding exposing business logic、 How to handle authorization with Breeze JS?
展開が制限されているテーブルではなく、制限されていないテーブルに展開されることがあるため、展開を防止するには広すぎます。このようなメカニズムは、どのテーブルを展開するのが許可されていないかを列挙できればうまくいくでしょう。あなたの2番目のアイデアについて:私はそれを試してみましょう!クライアントコードを変更する必要があるのか、パラメータが自動的にロードされるのか不思議です。また、1)odataオプションを検査するか、2)odataオプションを適用するか、クエリを実行してからクエリ結果を確認するかを選択できます。 – steve
したがって、optionsパラメータは自動的にロードされます。クール!そして、時にはうまくいく...時々。しかし、時々私はこのエラーが発生します:[[System.NotSupportedException: 'System.Web.Http.OData.Query.Expressions.SelectExpandBinder + SelectAllAndExpand'1型をキャストできません[[DevList_Steve.Model.IssueTag、DevList-Steve、Version = 1.0.6103.15380、Culture =ニュートラル、PublicKeyToken = null]] 'を入力して' DevList_Steve.Model.IssueTag 'と入力します。 LINQ to Entitiesは、EDMプリミティブまたは列挙型のキャストのみをサポートしています。]]悲しいことに、それは私にとってはうまくいきません。 – steve