Snæ*_*ørn 6 c# odata asp.net-web-api asp.net-web-api-odata
我有一些实体,其数据必须只能供某些用户访问.
public class Foo
{
public virtual Bar { get; set; }
...
}
public class Bar
{
public string Secret { get; set; }
...
}
Run Code Online (Sandbox Code Playgroud)
例如,Bar.Secret只能通过UserA但不能访问UserB.我可以这样:
public class BarsController : ODataController
{
[EnableQuery]
public IHttpActionResult Get()
{
if (User.Identity.Name != "UserA")
return Unauthorized();
return _db.Bars();
}
}
Run Code Online (Sandbox Code Playgroud)
除此之外是一个糟糕的实施.它不包括此控制器:
public class FoosController : ODataController
{
[EnableQuery]
public IHttpActionResult Get()
{
return _db.Foos();
}
}
Run Code Online (Sandbox Code Playgroud)
哪个可以调用,/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);
}
}
Run Code Online (Sandbox Code Playgroud)
您可以在执行查询之前验证查询选项,如果用户无权检索请求的数据,则会失败。为此,请从EnableQueryAttribute派生并覆盖ValidateQuery。
public class SecureEnableQueryAttribute : EnableQueryAttribute
{
public virtual void ValidateQuery(HttpRequestMessage request, ODataQueryOptions queryOptions)
{
base.ValidateQuery(request, queryOptions);
// Insert custom logic, possibly looking at queryOptions.SelectExpand
// or queryOptions.RawValues.
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
308 次 |
| 最近记录: |