2

Entity Framework を使用してデータを保護するために、どのようなオプション/ソリューションがありますか?

ここでは、フォーム ログインなどについては説明しません。ユーザーが認証されているかどうかを前提としています。

説明するために、Web API コントローラーの 1 つを接続しましたが、これがその方法であるかどうか疑問に思います。私が尋ねる理由は、すべてのコントローラーで公開するデータにこのすべてのロジックを書き込むよりも、これを行う簡単な方法があるかどうか疑問に思っているからです。

また、自分のクエリに $expand=TrafficImages を追加できる Breezejs や odata などのシステムを調べた場合、ユーザーが自分のホール データベースを取得できるようにしたくありません。

要約すると、ユーザーが機密データをダウンロードできないように公開されたデータを保護するには、どのような方法があるのでしょうか。

[AllowAnonymous]
public object GetTheoryTests()
{
    var identity = ((ClaimsIdentity)((ClaimsPrincipal)HttpContext.Current.User).Identity);
    //if (HttpContext.Current.User.Identity.IsAuthenticated)


   if (!identity.IsAuthenticated)
     return db.TheoryTests.Include(t=>t.TrafficImages).Where(t=>t.PublicAvalible)
            .Select(t => new { Id = t.Id, Title = t.Title, Images = t.TrafficImages }).AsEnumerable();

   if (User.IsInRole("WebAdmins"))
       return db.TheoryTests.AsEnumerable();

    var key = identity.GetProvider();

    var member = db.Members.Include(m=>m.PayedTheoryTests).SingleOrDefault(m=>m.Identities.Any(
        i=>i.identityprovider == key.provider &&
        i.nameidentifier == key.id));
        if(member!=null)
            return db.TheoryTests.Include(t => t.TrafficImages).Where(t => t.PublicAvalible).Select(t => new { Id = t.Id, Title = t.Title, Images = t.TrafficImages }).AsEnumerable();
        else
            return db.TheoryTests.Include(t => t.TrafficImages).Where(t => t.PublicAvalible)
                .Union(member.PayedTheoryTests).Select(t => new { Id = t.Id, Title = t.Title, Images = t.TrafficImages }).AsEnumerable();



}

それについて考えるとき、私が見逃しているのは、ユーザーの状態に応じて、データベースの最上位にあるビューモデルのようなものです。同じデータベース上に 2 つのエンティティ フレームワークを作成することは解決策になるでしょうか。

4

2 に答える 2

3

その間、QueryInterceptors が到着するまで、他の手順を実行する必要があります。まず、Web API コントローラーまたはメソッドを保護するための手法を検討する必要があります。これは、この回答の範囲を超える主題です。

第二に、w/r/t $expand については、その機能に警戒するのは当然です。一部のコントローラーメソッドでどの拡張が要求されているかを調べたり、他のコントローラーメソッドでそれを完全に禁止したりしたい場合があります。

幸いなことに、これは比較的簡単に行うことができます。リクエストのクエリ文字列にアクセスできます。その文字列に「$expand」が存在することを検出し、特定の展開を許可して他の展開を禁止するかどうかを分析できます。

Breeze は将来、このためのヘルパーを追加します。それまでは文字列を処理する必要があります。

余裕がある場合は、この目的のために独自のアクション フィルターを作成することもできます。

于 2012-10-30T15:26:37.363 に答える
2

素晴らしい質問です!. 現在、サーバーに送信されたクエリを調べて、場合によっては変更または拒否できる QueryInterceptors と呼ばれるものに取り組んでいます。「プリンシパル」は、各 QueryInterceptor メソッド内で使用可能なコンテキスト オブジェクトになります。「Breeze」ウェブサイト www.breezejs.com でこの機能に投票してください。

于 2012-10-29T21:01:33.540 に答える