WCF, веб-службы RESTful и пользовательская аутентификация - PullRequest
17 голосов
/ 16 мая 2011

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

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

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

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

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

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

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

1 Ответ

10 голосов
/ 17 мая 2011

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

В итоге я выбрал схему аутентификации HMAC (Hash-Message Authentication Code) для своих услуг.

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

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

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

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

  • apikey
  • userToken
  • secret
  • timestamp
  • nonce

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

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

...