我有一些实体的数据只能供某些用户访问。
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);
}
}