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. 我不能只是禁用$expandFoo因为该查询是完全合法的UserA,也是需要的。

有没有办法让 OData 针对某些涉及所请求实体的谓词验证查询。

就像是

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

1 回答 1

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.
    }
}
于 2016-02-03T05:01:54.443 回答