6

一部のユーザーのみがアクセスできるようにする必要があるデータを持つエンティティがいくつかあります。

public class Foo
{
    public virtual Bar { get; set; }
    ...
}

public class Bar
{
    public string Secret { get; set; }
    ...
}

たとえば、からのBar.Secretみアクセスできる必要がありますが、 からはアクセスできUserAませんUserB。私はこのようなことができます:

public class BarsController : ODataController
{
    [EnableQuery]
    public IHttpActionResult Get()
    {
        if (User.Identity.Name != "UserA") 
            return Unauthorized();

        return _db.Bars();
    }
}

それに加えて、実装が悪いです。このコントローラーは対象外です。

public class FoosController : ODataController
{
    [EnableQuery]
    public IHttpActionResult Get()
    {
        return _db.Foos();
    }
}

で呼び出すことができ/odata/Foos?$expand=Bars、それから を表示できますBar.Secret。そのクエリは完全に合法であり、必要でもあるため、単に無効$expandにすることはできません。FooUserA

要求されたエンティティを含むいくつかの述語に対して OData でクエリを検証する方法はありますか。

何かのようなもの

public class SecureEnableQueryAttribute : EnableQueryAttribute
{
    public bool ValidateResult(IEnumerable<T> entities)
    {
        return entities.All(x => x.Secret == UserA.Secret);
    }
}
4

1 に答える 1