Двухфакторная аутентификация в спокойном веб-API

Я создаю новое приложение веб-API asp.net, используя прямой html 5 и службу покоя веб-API. Я уже использую аутентификацию с помощью форм и атрибут [Authorize] для защиты вызовов веб-API. Я стараюсь оставаться верным, насколько это возможно, принципам покоя.

Я имитирую то, что делает существующее приложение, которое использует двухфакторную аутентификацию и использует веб-формы asp.net. Двухфакторная аутентификация используется не для входа в систему, а для дополнительной задачи удаленного доступа к другому компьютеру через сайт и плагин.

Существующее веб-приложение использует состояние сеанса для хранения PIN-кода, который создается и отправляется пользователю по электронной почте. Затем, когда пользователь вводит пин, он сверяется с пином в состоянии сеанса.

Так что, похоже, мои варианты...

  1. Зашифруйте пин-код, сгенерированный на сервере, и отправьте его обратно клиенту в javascript. Этот вариант кажется угрозой безопасности. Это будет более спокойный вариант.
  2. Коллега предложил использовать что-то вроде того, что делает Amazon S3, используя пару открытый/закрытый ключ.
  3. Использовать состояние сеанса, несмотря на использование веб-API.

Итак, какой из этих вариантов является лучшим вариантом? Есть ли другие возможности?


person Ben Anderson    schedule 14.12.2012    source источник
comment
Посмотрите, есть ли у этого поста заголовок ="почему и ключ, и секрет во многих веб-API"> stackoverflow.com/questions/12586147/ помогает.   -  person basiljames    schedule 02.01.2013


Ответы (2)


Я не уверен на 100%, что понимаю вашу архитектуру, но кажется очень важным, чтобы ваша безопасность ни в коем случае не зависела от клиента.

Предположим, что у пользователя есть отладчик javascript в браузере (что большинство людей на самом деле делает, не осознавая этого) и пользовательская сборка вашего плагина.

Таким образом, запрос вторичного PIN-кода должен быть встроен на стороне сервера в протокол «удаленного взаимодействия». Если это что-то основанное на RDP или VNC, должна быть возможность изменить пароль подключения данного пользователя на лету на одноразовый PIN-код.

person Szocske    schedule 08.01.2013

Я считаю, что вы не должны уделять слишком много внимания принципам RESTful (подождите, я это сказал? :))... Видите ли, одна сторона - это теория, а другая - практика. На практике вам часто приходится нарушать принципы RESTful для обеспечения безопасности! Возьмем nonce - это большое случайное число, генерируемое для каждого запроса, которое затем проверяется на сервере, если такое же nonce ранее не было отправлено. Это включает в себя сохранение состояния (одноразовые номера) — т. е. оно не без сохранения состояния, но иногда имеет решающее значение для безопасности. Также, кстати, часто используемый OAuth не является RESTful.

Для шифрования ПИН-кода не следует использовать клиент JavaScript! Однако вы можете реализовать некоторую конечную точку шифрования в домене, где используется клиент JavaScript:

  1. Используя XMLHTTPRequest, сгенерируйте запрос к URL-адресу конечной точки (например, /api/encrypt).
  2. Сервер получает этот запрос и шифрует PIN-код на сервере, т. е. PIN-код не попадает в браузер в открытом состоянии.
  3. Сервер возвращает зашифрованный PIN-код клиенту JavaScript.
  4. Клиент отправляет зашифрованный PIN-код клиенту.

Ваш коллега дал хорошую рекомендацию! Amazon — одна из лучших реализаций REST API.

Также проверьте мою идею: >https://stackoverflow.com/questions/15418764/ищущий-для-обратной связи-на-моем-остатке-стиль-апи-аутентификации-дизайн-и-два-фактора-а.

person Andriy Lesyuk    schedule 15.03.2013