У меня есть некоторые объекты, у которых есть данные, которые должны быть доступны только для некоторых пользователей.WebApi OData для безопасности пользователя по свойству
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);
}
}