Как ограничить доступ к некоторым свойствам или классам в OData веб-API ASP.NET?

У меня урок:

public class Person
{
    public virtual int Id { get; set; }
    public virtual string Name { get; set; }
    public virtual DateTime BirthDate { get; set; }
}

И у меня есть контроллер WebAPI OData:

public class PeopleController : ODataController
{
    [Queryable]
    [HttpGet]
    public IQueryable<Person> Get()
    {
        return (new MyEfContext()).People;
    }
}

Также у меня есть в global.asax следующий код:

ODataConventionModelBuilder modelBuilder = new ODataConventionModelBuilder();
modelBuilder.EntitySet<Person>("Person");
config.Routes.MapODataRoute(
            routeName: "MainModelQueryOdata",
            routePrefix: "query/main",
            model: modelBuilder.GetEdmModel(),
            pathHandler: new DefaultODataPathHandler(),
            batchHandler: new DefaultODataBatchHandler(GlobalConfiguration.DefaultServer),
            routingConventions: conventions);

Я хочу скрыть свойство BirthDate от неадминистраторов и когда текущий пользователь не является этим человеком. Как лучше добиться этого в ASP.NET WebAPI OData? У меня есть CurrentUserId для сравнения с person.Id, и у меня есть флаг CurrentUserIsAdmin для проверки. Проблема в том, что я не могу добавить условие в модель Odata через modelBuilder, так как нет поддержки такого поведения - я могу только полностью удалить сущность или свойство для всех, но мне нужно показать это администраторам и самим людям.


person Alexander Vasilyev    schedule 02.07.2014    source источник
comment
вы хотите ограничить от фактического уровня класса Person? если это WebApi, то разве у вас нет какого-то уровня бизнес-логики с чем-то вроде getPerson(), где вы можете написать эту логику?   -  person Scott Selby    schedule 02.07.2014
comment
Это не чистый WebAPI, а OData. Я добавлю код в свой пост, чтобы быть более точным.   -  person Alexander Vasilyev    schedule 08.07.2014


Ответы (1)


Я думаю, Динамическая модель — это то, что вам нужно.

Проверьте этот пример кода: https://aspnet.codeplex.com/SourceControl/latest#Samples/WebApi/OData/v4/DynamicEdmModelCreation/ReadMe.txt

person Feng Zhao    schedule 02.08.2014
comment
Ух ты! Действительно! Благодарю вас! Однако я думаю, что производительность будет не очень хорошей, нужно протестировать этот подход... А также я должен перейти на OData v4, но это не большая проблема. - person Alexander Vasilyev; 07.08.2014
comment
ссылка больше не работает, и я не смог найти ссылку now - person Simon; 28.03.2021