Подключение к службе 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 на стороне службы и измените настройки клиента в соответствии с ними.

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