Как настроить безопасные службы RESTful с помощью WCF с использованием имени пользователя/пароля + SSL
Я хочу написать конфигурационный файл, который позволяет использовать службы RESTful в WCF, но я все еще хочу, чтобы "подключался" к провайдеру членства для аутентификации имени пользователя и пароля.
Ниже приведена часть моей текущей конфигурации с использованием привязки basicHttp или wsHttp w/out WS Security, как это изменится с помощью служб на основе REST?
<bindings>
<wsHttpBinding>
<binding name="wsHttp">
<security mode="TransportWithMessageCredential">
<transport/>
<message clientCredentialType="UserName" negotiateServiceCredential="false" establishSecurityContext="false"/>
</security>
</binding>
</wsHttpBinding>
<basicHttpBinding>
<binding name="basicHttp">
<security mode="TransportWithMessageCredential">
<transport/>
<message clientCredentialType="UserName"/>
</security>
</binding>
</basicHttpBinding>
</bindings>
<behaviors>
<serviceBehaviors>
<behavior name="NorthwindBehavior">
<serviceMetadata httpGetEnabled="true"/>
<serviceAuthorization principalPermissionMode="UseAspNetRoles"/>
<serviceCredentials>
<userNameAuthentication userNamePasswordValidationMode="MembershipProvider"/>
</serviceCredentials>
</behavior>
</serviceBehaviors>
</behaviors>
Ответы
Ответ 1
ОБНОВЛЕНИЕ 01/23/2012
Поскольку я написал этот вопрос, я видел гораздо лучший подход к защите REST, как веб-сервисы в дикой природе. Это было сложно, когда я впервые услышал об этом, но идея проста и во всем Интернете как для веб-сервисов, так и для другой безопасной связи.
Для этого требуется использование открытых/закрытых ключей.
1.) каждому пользователю (клиенту) конечной точки необходимо будет зарегистрироваться в веб-службе REST
- a.) вы предоставляете этому пользователю закрытый ключ, который не должен использоваться совместно с
кто-нибудь
- b.) вы также генерируете открытый ключ, который может проходить через провод
в случае необходимости (в обычном тексте) (это также будет использоваться для идентификации клиента).
2.) каждый запрос от пользователя должен генерировать хеш для подписи запроса
- a.) Одним из примеров может быть: private key + timestamp + закодированная полезная нагрузка (если она достаточно мала, например простая информация о пользователе, которая должна быть обновлена)
- b.) вы берете эти 3 (или все, что вы решили), и генерируете хэш 1-го уровня (например, с помощью hmac)
- c.) в запросе, отправляемом по проводу, вы включаете открытый ключ (так что серверная сторона знает, кто пытается отправить этот запрос), хэш, который был сгенерирован с закрытым ключом, и метку времени.
3.) конечная точка сервера (ваш метод REST) должна будет генерировать хэш, используя те же самые входы, которые используются на клиенте. Этот шаг докажет, что и клиент, и сервер знали закрытый ключ, который соответствовал открытому ключу, переданному вместе с запросом. (это, в свою очередь, означает, что пользователь, отправляющий запрос, является законным, поскольку никто другой не может знать закрытый ключ)
-
a.) искать закрытый ключ клиентов открытым ключом, который передается во время запроса
-
b.) возьмите другие параметры (временную метку и закодированную полезную нагрузку) вместе с секретным ключом, который вы нашли на предыдущем шаге, и используйте тот же алгоритм для генерации 1-х точечного хэша (снова hmac - это то, что я видимый в реальном мире)
- c.) полученный 1-х ходовой хэш должен соответствовать хешу, отправленному по проводу, если не отправить обратно 400 (или любой другой http-код, который вы считаете "плохим" ).
Ответ 2
Вот подкаст по защите служб REST WCF с провайдером членства ASP.net:
http://channel9.msdn.com/posts/rojacobs/endpointtv-Securing-RESTful-services-with-ASPNET-Membership/
Ответ 3
Я согласен с Даррелом в том, что сложные сценарии REST над WCF - плохая идея. Это просто некрасиво.
Однако у Доминика Байера есть хорошие сообщения об этом в его блоге с наименьшими привилегиями.
Если вы хотите, чтобы поддержка WSSE-аутентификации поддерживалась с поддержкой резервного копирования FormsAuthenticationTicket в WCF, проверьте исходный код BlogService.
Ответ 4
Прежде чем продолжить этот путь борьбы с реализацией REST над WCF, я предлагаю вам прочитать этот пост Тима Эвальда. На меня особенно повлияло следующее утверждение:
Я не уверен, что хочу построить слой, предназначенный для включения HTTP в верх слоя, который был разработан для исключить его.
Я провел последние 12 месяцев, основываясь на материалах, основанных на REST, с WCF, и это утверждение доказало свою истинность снова и снова. IMHO, что WCF приносит в таблицу, перевешивается той сложностью, которую он вводит для выполнения работы REST.
Ответ 5
Независимо от того, есть ли у сообщества мнения относительно REST на WCF (я лично на заборе), Microsoft провела на него удар, http://msdn.microsoft.com/en-us/netframework/cc950529.aspx
Ответ 6
Да, согласен с Moto, связь с WCF Starter Kit - это самое близкое, что я видел для аутентификации учетных данных с использованием настраиваемого HTTP-заголовка (http://msdn.microsoft.com/en-us/library/dd203052.aspx).
Однако я не мог получить пример.
Ответ 7
Попробуйте custombasicauth @codeplex