WCF, веб-службы RESTful и пользовательская аутентификация
Я начинаю верить, что я чрезвычайно некомпетентный программист. После долгих чтений я все еще не могу понять, как правильно реализовать механизм аутентификации для службы RESTful WCF.
Я перепробовал все:
Следуя этому руководству, узнайте только, что предложенный механизм аутентификации - отвратительный взлом.
Установка стартового комплекта WCF REST только для того, чтобы выяснить, что он устарел и был заменен другим шаблоном проекта.
Установите указанный шаблон проекта только для того, чтобы убедиться, что он не предоставляет какой-либо собственный механизм аутентификации.
Установите модуль IIS, который обеспечивает пользовательские функции проверки подлинности на транспортном уровне,
только чтобы выяснить, что автор не предоставляет никакой документациитолько чтобы узнать, мне нужно реализоватьMembershipProvider
, (Я хочу предоставить толькоUserNamePasswordValidator
.)
Есть ли разумный способ реализовать механизм аутентификации для службы RESTful WCF?
1 ответ
Когда я изучал, как реализовать безопасность для моей собственной службы RESTful WCF, я потратил некоторое время на изучение того, как другие популярные сервисы, такие как flickr и amazon, реализуют свою собственную безопасность - предполагая, что они, вероятно, потратили на это гораздо больше времени, чем я. Документация Flickr, в частности, помогла сформировать, как я формировал свои подписи и запросы.
В итоге я выбрал схему аутентификации HMAC (Код аутентификации сообщений на основе хэша) для своих сервисов.
Я создал пользовательский HMAC ServiceAuthorizationManager, который проверяет подпись каждого запроса по мере его поступления. Каждый запрос содержит следующее:
- токен пользователя
- отметка времени
- данное время
- подпись
Используя эту информацию, менеджер может найти секрет пользователя по его токену и воссоздать подпись на сервере, используя предоставленную информацию.
Моя подпись состоит из хеша MD5 следующего (значения объединяются в определенном порядке и хешируются, чтобы значение можно было повторить на сервере):
- apikey
- userToken
- секрет
- отметка времени
- данное время
Я храню одноразовые номера в экземпляре memcache в течение короткого периода времени, чтобы быстро проверить против любых атак воспроизведения. По истечении этого времени (около 10 минут) отметка времени используется для отклонения любых других старых запросов.
Я могу опубликовать некоторые фрагменты своего кода, если это поможет. В целом я обнаружил, что аутентификация HMAC, как правило, является наиболее безопасным способом и легко поддерживается на любых клиентах, которые будут использовать ваш сервис (не только на.NET).