#asp.net-mvc #json #ios4 #restful-authentication
#asp.net-mvc #json #ios4 #restful-аутентификация
Вопрос:
Я собираюсь написать сервисы для приложения iPhone, создаваемого сторонним поставщиком.
Я буду использовать ASP.NET MVC для приема сообщений, а также возврата данных в формате JSON.
Мой вопрос в том, как вы это защищаете?
Возможно, просто используя ключ API? Будет ли этого достаточно, чтобы гарантировать, что доступ к указанным службам разрешен только данным из приложений iPhone?
Ответ №1:
Я сам как бы борюсь с теми же концепциями. Я думаю, что первое, что нужно сделать, это использовать только HTTPS, чтобы это было более безопасно, чем нет.
Далее, это зависит от того, как вы собираетесь выполнять аутентификацию. Если все, что вам нужно, это ключ API (для отслеживания того, какой объект обращается к данным), это должно быть прекрасно. Если вы также хотите отслеживать информацию о пользователе, вам понадобится какой-то способ связать, чтобы определенные ключи API могли получать доступ к определенным типам записей, на основе соединения где-нибудь.
Я собираюсь выполнить аутентификацию форм в своем приложении и использовать файл cookie для аутентификации. К счастью ASP.NET IIS может выполнить за вас большую часть этой тяжелой работы.
Примерное время: (Я уверен, что мне нужно будет добавить к этому больше, но пока я на работе, это дает повод для размышлений)
Проверка подлинности форм: отправьте пару (или более) полей в теле формы. Этот ПОСТ от начала до конца. Нет такого количества необратимого хеширования, которое могло бы сделать это безопасным. Чтобы защитить его, вы должны либо всегда находиться за брандмауэром от всех посторонних глаз (да, правильно), либо вы должны быть через HTTPS. Достаточно просто.
Базовая аутентификация: отправьте строку «имя пользователя: пароль» в кодировке base64 по сети как часть заголовка. Обратите внимание, что base64 должен быть защищен, как сетчатая дверь для подводной лодки. Вы же не хотите, чтобы оно было незащищенным. Требуется HTTPS.
Ключ API:Это говорит о том, что приложение предположительно является XYZ. Это должно быть закрытым. Это не имеет никакого отношения к пользователям. Предпочтительно, чтобы во время запроса ключа API открытый ключ предоставлялся лицу, предоставляющему API, что позволяет кодировать ключ API при передаче, гарантируя, таким образом, что он остается закрытым, но при этом подтверждает, что источник является тем, кем он является. Это может усложниться, но поскольку существует процесс подачи заявки и поскольку он не зависит от поставщика, это можно сделать через HTTP. Это означает не для каждого пользователя, это означает для каждой компании-разработчика, котораяиспользует ваш api.
Итак, чего вы хотите добиться, так это того, чтобы приложение, получающее доступ к вашим данным и желающее убедиться, что это авторизованное приложение, могло согласовываться с использованием закрытых ключей для подписи во время выполнения. Это гарантирует, что вы общаетесь с приложением, с которым хотите общаться. Но помните, это не означает, что пользователь является тем, за кого себя выдает.
ОДНАКО.
Что вы можете сделать, так это использовать ключ API и связанные с ним открытые / приватные ключи для кодирования имени пользователя и пароля для отправки их по сети с использованием HTTP. Это очень похоже на то, как работает HTTPS, но вы шифруете только конфиденциальную часть сообщения.
Но чтобы позволить пользователю отслеживать свою информацию, вам придется назначить токен на основе логина пользователя. Итак, позвольте им войти в систему, отправить данные по сети, используя соответствующую систему, затем верните некоторый уникальный идентификатор, который представляет пользователя обратно в приложение. Затем позвольте приложению отправлять эту информацию каждый раз, когда вы выполняете специфические для пользователя задачи. (как правило, постоянно).
Способ отправки по сети заключается в том, что вы говорите клиенту установить cookie, и все реализации HttpClient, которые я когда-либо видел, знают, что когда они делают запрос к серверу, они отправляют обратно все когда-либо установленные сервером cookie, которые все еще действительны. Это просто происходит для вас. Итак, вы устанавливаете на свой ответ на сервере файл cookie, содержащий любую информацию, необходимую вам для связи с клиентом.
HTH, задавайте мне больше вопросов, чтобы мы могли доработать это дальше.
Комментарии:
1. Итак, будут ли forms auth передавать файл cookie аутентификации в приложение iPhone?
2. Конечно. Все это обрабатывается транспортным механизмом HTTP (S). Конечно, вам нужно будет записать это специально в приложении iPhone, но, похоже, это делает кто-то другой. Просто расскажите им, как вы выполняете аутентификацию, и позвольте им разобраться с этим.
3. Итак, это позволило бы аутентифицировать «приложение», что, если приложению также требуется аутентифицировать пользователей? Например, если бы у приложения был способ для пользователей входить в систему и редактировать профиль, возможно.
4. @JackMarchetti ~ Попробуйте еще раз. Как это выглядит? Помогает ли это вам понять, куда двигаться в ближайшем будущем?
5. Да, именно поэтому это обычно не предпочтительнее для использования в браузере, но больше там, где вы можете быть уверены, что клиенты не будут полными придурками. Например, кто-то использует ваш API для создания приложения поверх, возможно. Обычно я бы рассматривал ключ API для использования в той или иной форме другим разработчиком. Подумайте о OAuth, где вы авторизуете приложение, и они хранят токен в своей базе данных. Затем они могут притворяться вами. Вся авторизация, которую вы выполнили, вы просто дали им разрешение на использование этого ключа.
Ответ №2:
Одним из вариантов было бы использовать проверку подлинности forms и использовать cookie-файл аутентификации. Кроме того, убедитесь, что все вызовы служб отправляются по протоколу SSL.
Комментарии:
1. Итак, передаем файл cookie аутентификации обратно в приложение iphone?
2. Да, и пусть приложение для iphone сохранит файл cookie forms. Это было бы самым простым вариантом, поскольку вы уже используете iis / asp.net без необходимости заново изобретать собственную систему безопасности.