Проблема использования службы IIS - локально и удаленно - PullRequest
0 голосов
/ 02 апреля 2020

Я создаю 2 службы для проекта, над которым я сейчас работаю.

1) простая служба запросов клиент-сервер, использующая basicHttpBinding

2) служба данных обратного вызова с использованием WSDualHttpBinding

с некоторым трюком я смог разместить как в IIS, так и в локальном браузере, а также на другом компьютере, который будет взаимодействовать с обоими сервисами: /Service.svc.

вот раздел app-config для службы данных обратного вызова

    <system.serviceModel>
  <behaviors>
    <endpointBehaviors>
      <behavior name="myBehavior">
        <clientVia />
      </behavior>
    </endpointBehaviors>
  </behaviors>
  <bindings>
        <wsDualHttpBinding>
            <binding name="WSDualHttpBinding_IDataService">
              <security mode="None">
                <message negotiateServiceCredential="false" clientCredentialType="None" />
              </security>
            </binding>
          </wsDualHttpBinding>
    </bindings>
    <client>
        <endpoint address="http://<address>:50111/Service.svc/service"
            binding="wsDualHttpBinding" bindingConfiguration="WSDualHttpBinding_IDataService" behaviorConfiguration="myBehavior"
            contract="CallbackService.IDataService" name="WSDualHttpBinding_IDataService">
        </endpoint>
    </client>
</system.serviceModel>

basicHttpBinding выглядит очень похоже - только для другого порта

Я установил IIS для анонимной аутентификации. Пользователь IUSR, нет пароль ..

Первоначально он работал локально - но с удаленного компьютера я получил ошибки аутентификации ... поэтому я подправил еще немного - и теперь я получаю тайм-аут даже локально ... хотя Visual Studio взаимодействует со ссылкой на службу Обе службы просто отлично.

Как мне заставить службу "сотрудничать" снова

И я в своем уме - Любая помощь с благодарностью !?

Редактировать: первая проблема решена - локальная связь восстановлена ​​

public ClientCallbacks myCallbacks=new ClientCallbacks();      
public DuplexChannelFactory<IDataService> channelFactory { get; set; }
public IDataService channel;

public int connect() {
    WSDualHttpBinding binding = new WSDualHttpBinding() 
        { Name = "WSDualHttpBinding_IDataService" };
    this.channelFactory = new DuplexChannelFactory<IDataService>(
        mainForm.dbCommunication.myCallbacks,
        binding,
        new EndpointAddress("http://<address>:50111/Service.svc/service"));
    this.channel = this.channelFactory.CreateChannel();
...
...
channel.AddListener(int-parameter); // announce new callback-partner
...
...
 this.newListe = this.myCallbacks.receivedTaskList; //get Tasklist over callback

Это работает локально - но при удаленном вызове я получаю "новую" ошибку

System.ServiceModel.Security.SecurityNegotiationException:
  The caller was not authenticated by the service. ---> 
  System.ServiceModel.FaultException: The request for security token could not be satisfied
 because authentication failed.
   at System.ServiceModel.Security.SecurityUtils.ThrowIfNegotiationFault
    (Message message, EndpointAddress target)
at System.ServiceModel.Security.SspiNegotiationTokenProvider.GetNextOutgoingMessageBody
    (Message incomingMessage, SspiNegotiationTokenProviderState sspiState)
--- End of inner exception stack trace ---

И снова Я изо всех сил пытаюсь найти подсказку / решение. Я устанавливаю анонимную проверку подлинности IIS ... но кажется, что связь блокируется до того, как эта точка достигнута. Что мне нужно сделать, чтобы получить доступ к службе с удаленного компьютера?

1 Ответ

1 голос
/ 10 апреля 2020

Похоже, что мы должны предоставить учетные данные для аутентификации клиента на стороне сервера. какой тип учетных данных должен быть предоставлен, зависит от конфигурации привязки на стороне сервера.
По умолчанию. Режим безопасности WsDualhttpbinding настроен на режим безопасности сообщений, а тип учетных данных клиента - Windows.
Эти приведенные ниже фрагменты кода эквивалентны.

WSDualHttpBinding binding = new WSDualHttpBinding();

WSDualHttpBinding binding = new WSDualHttpBinding();
            binding.Security.Mode = WSDualHttpSecurityMode.Message;
            binding.Security.Message.ClientCredentialType = MessageCredentialType.Windows;

Из вашего фрагмента кода я не видел вашей конфигурации на стороне сервера. Если требуются Windows учетные данные, рассмотрите следующие сегменты кода.

//ChannelFactory<IService> channelFactory = new ChannelFactory(...);
            channelFactory.Credentials.Windows.ClientCredential.UserName = "administrator";
            channelFactory.Credentials.Windows.ClientCredential.Password = "123456";
            IService svc = channelFactory.CreateChannel();

Не стесняйтесь, дайте мне знать, если проблема все еще существует.

...