none
Azure Mobile Service: аутентификация, создание связанных таблиц RRS feed

  • Общие обсуждения

  • Доброго времени суток. Долго искал ответ на вопрос, но ясности нет.

    Имеем Azure Mobile Service. Сервисный код .Net. Портал сгенерил код для сервиса и для клиента (Xamarin for Android).

    Вопросов нет, все ясно и понятно. Создаются таблицы TodoItem, настраивается их синхронизация в автономном режиме, и пишем контроллер для таблицы на сервисе. Все работает, все замечательно.

    Теперь непонятности.

    1. Зарос всех данных

    public class TodoItemController : TableController<TodoItem>
        {
            // GET tables/TodoItem
            public IQueryable<TodoItem> GetAllTodoItems()
            {
                return Query();
            }
    ///Продолжение стандартного класса
    }

    Имеем класс контроллера. Имеем метод, возвращающий все записи в таблице. Но ведь устройству могут понадобиться не все данные, а только доступные для него? Как реализовать фильтр? Допустим, имеем на каждом устройстве свой id В виде строки. Чтобы контроллер имел вид:

    public class TodoItemController : TableController<TodoItem>
        {       
    
            // GET tables/TodoItem
            public IQueryable<TodoItem> GetAllTodoItems(string deviceId)
            {
                     
                return CustomQuery(deviceId);
            }
    
    }

    Как такое реализовать?

    2. Авторизация и аутентификация.

    В статье Microsoft Azure Mobile Services. Краткое руководство по разработке. Часть 3. Аутентификация. показано, как сделать авторизацию через Facebook. Но не всем надо же авторизоваться через сторонних провайдеров. Мне достаточно иметь идентификатор устройства или программы. Вопрос. Как реализовать собственную авторизацию, чтобы можно было фильтровать данные через доступ к свойству this.User на контроллере. Тогда отпадет необзодимость в первом вопросе.

    3. Связанные таблицы. 

    Поддерживает ли Azure Mobile Services связанные таблицы? Нигде нет достаточной информации.

    Например:

    public class TodoItem : EntityData
        {
            public string Text { get; set; }
    
            public bool Complete { get; set; }
        }
    
    public class TodoList : EntityData
    {
        public string User{get;set;}
        public virtual ICollection<ToDoItem> UserItem{get;set;}
    }
    Кто сталкивался, подскажите, будет ли работать такое связывание (по аналогии с EntityFrowork). 

    10 февраля 2017 г. 20:56

Все ответы

  • Коллеги. Отвечаю сам на свои вопросы.

    1. Для реализации фильтра по пользователю надо добавить Авторизацию. Как это сделать, см.пункт 2. Теперь к фильтру. К контроллеру надо добавить атрибут [Autorize]

    Код для получения идентификатора пользователя:

    var principals = this.User as ClaimsPrincipal;
    if (principals != null)
    {
       //Получим ИД пользователя
       string sid = principals.FindFirst(ClaimTypes.NameIdentifier).Value;
    
    }
    

    2. Начальный ответ нашел в документации.

    Но оказалось, что там ошибка: правильный код возврата

    return Ok(new
    {
     autentificationToken = token.RawData,
     User = new {userId = loginRequest.username}
    };

    После этого можно вызвать на клиенте метод логин.

    3. Еще не пробовал. Отпишусь по результату

    2 марта 2017 г. 16:30