一部のユーザーのみがアクセスできるようにする必要があるデータを持つエンティティがいくつかあります。
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
にすることはできません。Foo
UserA
要求されたエンティティを含むいくつかの述語に対して OData でクエリを検証する方法はありますか。
何かのようなもの
public class SecureEnableQueryAttribute : EnableQueryAttribute
{
public bool ValidateResult(IEnumerable<T> entities)
{
return entities.All(x => x.Secret == UserA.Secret);
}
}