2015-10-01 3 views
5

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

ответ

0

Вы можете проверить параметры запроса перед тем выполняется запрос и не сработать, если пользователь не авторизован для получения требуемых данных. Для этого выведите 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. 
    } 
} 
Смежные вопросы