Подключение к службе wcf, размещенной в домене, с клиента, которого нет в домене
Я хотел бы пример или объяснение того, как подключить клиента к службе wcf, когда клиент не находится в домене.
Я предполагаю, что есть способ указать учетные данные домена с клиентом, и служба wcf могла бы связаться с полномочным органом (dc), чтобы проверить, безопасен ли клиент.
Я следовал примерам в msdn и могу подключиться, чтобы увидеть метаданные (доступные методы), но при использовании wshttpbinding я получаю "Получено незащищенное или неправильно защищенное сообщение от другой стороны".
Заранее спасибо!
3 ответа
По умолчанию, wsHttpBinding
будет использовать учетные данные Windows - это работает только в том случае, если и ваша служба, и ваш вызывающий клиент являются членами одного домена (или членами доменов, имеющих отношения взаимного доверия).
Если вы хотите пройти аутентификацию, используя имя пользователя / пароль, вам нужно сделать несколько вещей:
службе требуется сертификат для аутентификации вызывающей стороны и для обеспечения механизма шифрования для обмена именем пользователя / паролями и сообщениями. Поэтому вам нужно будет создать сертификат безопасности и установить его на серверном компьютере, а также настроить его:
<system.serviceModel> <behaviors> <serviceBehaviors> <behavior name="Internet"> <serviceCredentials findValue="MyServiceCertificate" storeLocation="LocalMachine" storeName="My" X509FindType="FindBySubjectName" /> </behavior> <serviceBehaviors> <behaviors> <services> <service name="MyService" behaviorConfiguration="Internet"> ...... </service> </services> </system.serviceModel>
клиент должен установить конфигурацию, которая определяет
wsHttpBinding
с защитой сообщений и учетными данными клиента с именем пользователя и паролем<system.serviceModel> <bindings> <wsHttpBinding> <binding name="UserNameWS"> <security mode="Message"> <message clientCredentialType="UserName" /> </security> </binding> <wsHttpBinding> <bindings> <client> <endpoint name="Default" address="........." binding="wsHttpBinding" bindingConfiguration="UserNameWS" contract="........." /> </client> </system.serviceModel>
на стороне сервера вам нужно настроить механизм аутентификации этих имен пользователей и паролей - как правило, самый простой способ - это использовать систему членства ASP.NET
<system.serviceModel> <behaviors> <serviceBehaviors> <behavior name="Internet"> <userNameAuthentication userNamePasswordValidationMode="MembershipProvider" /> <serviceCredentials ..... </system.serviceModel>
перед каждым вызовом от клиента вам необходимо установить имя пользователя / пароль на клиентском прокси (это одна из немногих вещей, которые вы не можете сделать в конфигурации - работает только в коде).
proxy.ClientCredentials.UserName.UserName = "YourUserName"; proxy.ClientCredentials.UserName.Password = "Top$Secret";
Прочитайте все о безопасности WCF на сайте Руководства по безопасности WCF на Codeplex.
Причина, по которой вы можете получить доступ к метаданным и не можете вызвать службу, заключается в том, что вы используете WsHttpBinding, вероятно, с конфигурацией по умолчанию. Он использует безопасность сообщений, которая используется только для использования сервиса, а не для метаданных сервиса. Он использует учетные данные Windows и безопасность Windows для шифрования и подписи сообщений. Из-за безопасности Windows это работает, только когда клиент и сервер находятся в одном домене.
Ваш клиент не является частью домена - вы можете отправлять учетные данные Windows либо с защитой сообщений, либо с безопасностью транспорта. В случае защиты сообщений вам придется использовать clientCredentialType="UserName"
, по умолчанию для проверки пароля, и вам придется настроить сертификат X509 в служебном поведении для поддержки шифрования и подписи. В случае безопасности на транспорте будет использоваться либо HTTPS (сертификат X509, настроенный в http.sys/IIS), либо TransportCredentialOnly
режим, который будет отправлять имя пользователя и пароль Windows в виде простого текста по HTTP (это плохое решение). На случай безопасности на транспорте clientCredentialType="Basic"
,
Сообщение об ошибке "Необеспеченная или неправильно защищенная ошибка была получена от другой стороны" является довольно вводящим в заблуждение. Распространенной причиной является различие в конфигурации привязок между клиентом и сервером. Проверьте раздел system.serviceModel в файле web.config на стороне службы и измените настройки клиента в соответствии с ними.