WebApi OData每个用户的属性安全性

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)

len*_*est 1

您可以在执行查询之前验证查询选项,如果用户无权检索请求的数据,则会失败。为此,请从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)