WCF, веб-службы RESTful и пользовательская аутентификация

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

Я перепробовал все:

  1. Следуя этому руководству, узнайте только, что предложенный механизм аутентификации - отвратительный взлом.

  2. Установка стартового комплекта WCF REST только для того, чтобы выяснить, что он устарел и был заменен другим шаблоном проекта.

  3. Установите указанный шаблон проекта только для того, чтобы убедиться, что он не предоставляет какой-либо собственный механизм аутентификации.

  4. Установите модуль IIS, который обеспечивает пользовательские функции проверки подлинности на транспортном уровне, только чтобы выяснить, что автор не предоставляет никакой документации только чтобы узнать, мне нужно реализовать MembershipProvider, (Я хочу предоставить только UserNamePasswordValidator.)

Есть ли разумный способ реализовать механизм аутентификации для службы RESTful WCF?

1 ответ

Решение

Когда я изучал, как реализовать безопасность для моей собственной службы RESTful WCF, я потратил некоторое время на изучение того, как другие популярные сервисы, такие как flickr и amazon, реализуют свою собственную безопасность - предполагая, что они, вероятно, потратили на это гораздо больше времени, чем я. Документация Flickr, в частности, помогла сформировать, как я формировал свои подписи и запросы.

В итоге я выбрал схему аутентификации HMAC (Код аутентификации сообщений на основе хэша) для своих сервисов.

Я создал пользовательский HMAC ServiceAuthorizationManager, который проверяет подпись каждого запроса по мере его поступления. Каждый запрос содержит следующее:

  • токен пользователя
  • отметка времени
  • данное время
  • подпись

Используя эту информацию, менеджер может найти секрет пользователя по его токену и воссоздать подпись на сервере, используя предоставленную информацию.

Моя подпись состоит из хеша MD5 следующего (значения объединяются в определенном порядке и хешируются, чтобы значение можно было повторить на сервере):

  • apikey
  • userToken
  • секрет
  • отметка времени
  • данное время

Я храню одноразовые номера в экземпляре memcache в течение короткого периода времени, чтобы быстро проверить против любых атак воспроизведения. По истечении этого времени (около 10 минут) отметка времени используется для отклонения любых других старых запросов.

Я могу опубликовать некоторые фрагменты своего кода, если это поможет. В целом я обнаружил, что аутентификация HMAC, как правило, является наиболее безопасным способом и легко поддерживается на любых клиентах, которые будут использовать ваш сервис (не только на.NET).

Другие вопросы по тегам