0

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 logicHow to handle authorization with Breeze JS?

答えて

0

あなたは$expandを行ってからクライアントを防ぐためにAllowedQueryOptions を使用することができ、this SO answerで説明したように。

もう1つの方法は、WebAPIコントローラメソッドのパラメータとしてODataQueryOptionsを使用することです。これにより、サーバメソッド内のクエリ述語の詳細が得られます。そのため、WebAPIに自動的に適用させるのではなく、必要に応じてそれらを適用できます。これにより、クエリに基づいて展開されるかどうかが決まります。

this answerthis answerを参照してください。

+0

展開が制限されているテーブルではなく、制限されていないテーブルに展開されることがあるため、展開を防止するには広すぎます。このようなメカニズムは、どのテーブルを展開するのが許可されていないかを列挙できればうまくいくでしょう。あなたの2番目のアイデアについて:私はそれを試してみましょう!クライアントコードを変更する必要があるのか​​、パラメータが自動的にロードされるのか不思議です。また、1)odataオプションを検査するか、2)odataオプションを適用するか、クエリを実行してからクエリ結果を確認するかを選択できます。 – steve

+0

したがって、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

0

私の質問を読んだ人のおかげで、それについて考え、さらにはこれまでのところ対応していました。しかし、私にとっては何も示唆されていませんでした。だから、自分でそれを理解しました。私はオプション#1を実装して、いくつかのブリーズクラスをサブクラス化することができます。 EnableBreezeQueryAttributeをサブクラス化して、NewQueryHelperをオーバーライドしてQueryHelperサブクラスを返すようにします。次に、自分のサービスメソッドでCustomEnableBreezeQueryAttributeを使用します。 ValidateDataメソッドは、エンティティオブジェクトとともに呼び出されます。制限された情報が含まれている場合、または制限された情報を空白にすることができ、制限のない情報を返すことができる場合は、このメソッドを失敗する可能性があります。

public class CustomEnableBreezeQueryAttribute : EnableBreezeQueryAttribute 
{ 
    private class CustomQueryHelper : QueryHelper 
    { 
     public override IEnumerable PostExecuteQuery(IEnumerable queryResult) 
     { 
      queryResult = ValidateData(queryResult); 
      return base.PostExecuteQuery(queryResult); 
     } 

     private IEnumerable ValidateData(IEnumerable queryResult) 
     { 
      //TODO: validate/modify data 
     } 
    } 

    protected override QueryHelper NewQueryHelper() 
    { 
     return new CustomQueryHelper(); 
    } 
} 

これを行う方法がわかりにくいことに私は驚いています。そして、この時点でコードを注入するのは簡単ではないということです。厄介な質問で私を残す:私はやってはいけない何かをしていますか?それとも、これが本当にodata/breezeの機能に欠けているのでしょうか?または、これがどのようにodata/breezeで行われるのでしょうか?

関連する問題