Обновление от basicHttpBinding до wsHttpBinding: сбой соединения - PullRequest
1 голос
/ 27 июня 2010

Я поддерживаю программу, которая отправляет сообщения между пользователями.Клиенты подключаются к WCF-сервису, который размещен в IIS 7.0 на моем доменном сервере.До сих пор я успешно использовал basicHttpBinding для этого, без какой-либо конфигурации.Теперь я хочу изменить на wsHttpBinding, потому что это должно зашифровать транспорт сообщений.На сервере установлен сертификат, но я ничего не сделал, чтобы заставить эту работу работать со службой WCF.Я также не настроил никаких параметров для wsHttpBinding.

Теперь, когда я подключаюсь к WCF-сервису с любого клиента, который находится в домене, который управляется тем же сервером, на котором размещается WCF-сервис, все хорошо.Но когда я пытаюсь подключиться к услуге от клиента за пределами домена, соединение не удается.Клиент получает исключение, утверждающее, что «вызывающая сторона не была аутентифицирована службой».Так что это должно быть проблема аутентификации.

Как мне устранить это?Также приветствуется указатель на некоторые полезные ресурсы по этой теме.

РЕДАКТИРОВАТЬ: Так вот как я получил это работает.Надеюсь, это избавит некоторых из вас от головной боли ...

Проблема была в следующем:

  • IIS размещал два веб-сайта: mydomain.com и www.mydomain.com
  • Я хотел разместить службу WCF на www.mydomain.com, так как приобрел сертификат для этого URL.
  • WCF выдал ошибку «Эта коллекция уже содержит адрес со схемой http.В этой коллекции может быть не более одного адреса.у меня.
  • Вы должны решить эту проблему, добавив baseAddressPrefixFilter
  • Я хотел просто безопасность транспорта, без аутентификации пользователя

  • После того, как я решил, что я получилошибка о том, что: «Предоставленная схема URI« https »недействительна;ожидается 'http'
  • Эта ошибка генерируется клиентом , а не сервером.

Вот файл web.config, который добился цели:

<system.serviceModel>
     <serviceHostingEnvironment>
        <baseAddressPrefixFilters>
          <add prefix="http://www.mydomain.com"/>
        </baseAddressPrefixFilters>
     </serviceHostingEnvironment>

    <services>
      <service behaviorConfiguration="ServiceBehavior" name="MyApp.MyService">
        <endpoint address="mex"
                  binding="mexHttpsBinding"
          contract="IMetadataExchange"
           />
    <endpoint address="wsHttp"
          binding="wsHttpBinding"
                  bindingConfiguration="NoAuthentication"
                  contract="MyApp.IContract"/>
      </service>
    </services>
    <bindings>
    <wsHttpBinding>
        <binding name="NoAuthentication">
         <security mode="Transport">
            <transport clientCredentialType="None"/>
          </security>
        </binding>
    </wsHttpBinding>
   </bindings>
    <behaviors>
      <serviceBehaviors>
        <behavior name="ServiceBehavior">
          <!-- To avoid disclosing metadata information, set the value below to false and remove the metadata endpoint above before deployment -->
          <serviceMetadata httpsGetEnabled="true"/>
          <!-- To receive exception details in faults for debugging purposes, set the value below to true.  Set to false before deployment to avoid disclosing exception information -->
          <serviceDebug includeExceptionDetailInFaults="true"/>
        </behavior>
      </serviceBehaviors>
    </behaviors>
  </system.serviceModel>

Последнее, но очень важное: я должен был сказать клиенту, что он должен также использовать режим Transportsecurity, поскольку я не создавал клиент с помощью svcutil.

 public static IContract GetContract()
        {
            var binding = new WSHttpBinding(SecurityMode.Transport) {MaxReceivedMessageSize = 655350};
            var factory = new ChannelFactory<IContract>(
                          binding,
                          new EndpointAddress(@"https://www.mydomain.com/MyService.svc/wsHttp"));
            return factory.CreateChannel();
        }

1 Ответ

2 голосов
/ 27 июня 2010

Это ожидаемое поведение по умолчанию. WsHttpBinding по умолчанию будет использовать учетные данные Windows для аутентификации ваших абонентов. Это работает в вашем домене - но не за его пределами.

Что вам нужно сделать, это либо иметь вторую конечную точку, которая также использует wsHttpBinding, но с другими настройками безопасности, либо вам нужно переключить весь механизм аутентификации на что-то, что работает внутри и за пределами вашего домена - либо имя пользователя / пароль, например, например, Система членства ASP.NET на вашей стороне сервера, или вам нужно будет установить сертификат на компьютерах вызывающих абонентов.

Обновление: окончательным справочником будет Руководство по безопасности WCF для Codeplex , в котором есть множество инструкций и пошаговых инструкций о том, как выполнять конкретные связанные с безопасностью операции в WCF.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...