2012-02-21 4 views
1

Это может быть глупо/невозможно. Тем не менее, то, что я пытаюсь достичь следующим образом:Ошибка подключения к службе WCF со своего сервера-хостинга

  • У меня есть виртуальная машина хостинг веб-службы WCF в IIS 7 на Windows Server 2008
  • Я использую basichttp связывания
  • клиентский код работает отлично на других машинах
  • Этот сервер VM также должен выполнять пакетную обработку, поэтому мне нужно использовать клиентский доступ к этим WCF услуг на нем
  • При запуске на фактическом окне хостинг услуги WCF, которые я получаю ...

    System.ServiceModel.Security.MessageSecurityException: HTTP-запрос несанкционирован с помощью схемы аутентификации клиента «Ntlm». Заголовок аутентификации, полученный с сервера, был «Negotiate, NTLM». ---> System.Net.WebException: Удаленный сервер ответил на ошибку: (401) Неавторизованный. трассировки стека на System.Net.HttpWebRequest.GetResponse() в System.ServiceModel.Channels.HttpChannelFactory.HttpRequestChannel.HttpChannelRequest.WaitForReply (TimeSpan тайм-аута) --- Конец внутренней трассировки стека исключений ---

    сервера : на System.ServiceModel.Channels.HttpChannelUtilities.ValidateAuthentication (HttpWebRequest запрос, ответ HttpWebResponse, WebException responseException, HttpChannelFactory завод) на System.ServiceModel.Channels.HttpChannelUtilities.ValidateRequestReplyResponse (HttpWebRequest запрос, ответ HttpWebResponse, HttpChannelFactory завод, WebException responseException) в System.ServiceModel.Channels.HttpChannelFactory.HttpRequestChannel.HttpChannelR equest.WaitForReply (TimeSpan таймаут) в System.ServiceModel.Channels.RequestChannel.Request (сообщение Message, TimeSpan таймаут) на System.ServiceModel.Dispatcher.RequestChannelBinder.Request (сообщение Message, TimeSpan таймаут) в System.ServiceModel.Channels .ServiceChannel.Call (действие String, Boolean односторонняя, операция ProxyOperationRuntime, Object [] модули, Object [] выходы, TimeSpan тайм-аут) на System.ServiceModel.Channels.ServiceChannelProxy.InvokeService (IMethodCallMessage methodCall, операция ProxyOperationRuntime) на System.ServiceModel .Channels.ServiceChannelProxy.Invoke (Шеззаде сообщение)

    Исключение при вызваны повторно [0]: в System.Runtime.Remoting.Proxies.RealProxy.HandleReturnMessag е (Шеззаде reqMsg, Шеззаде retMsg) на System.Runtime.Remoting.Proxies.RealProxy.PrivateInvoke (MessageData & msgData, типа Int32)

Что мне интересно, является ли то, что я пытаюсь на самом деле возможно - Я не вижу причин, по которым я не могу подключиться к сервису с хост-машины, но специфика может помешать мне - и если да, какие изменения мне необходимо внести в мои настройки для ее достижения?

Библиотека DLL касается устанавливает связывание следующим образом ...

BasicHttpBinding binding = new BasicHttpBinding(); 

    binding.Security.Mode = BasicHttpSecurityMode.TransportCredentialOnly; 
    binding.Security.Transport.ClientCredentialType = HttpClientCredentialType.Ntlm; 
    binding.TransferMode = TransferMode.Buffered; 
    binding.MaxBufferPoolSize = int.MaxValue; 
    binding.MaxReceivedMessageSize = int.MaxValue; 
    binding.ReaderQuotas.MaxArrayLength = int.MaxValue; 
    binding.ReaderQuotas.MaxStringContentLength = int.MaxValue; 
    binding.OpenTimeout = openTimeout; 
    binding.SendTimeout = sendTimeout; 
    binding.ReceiveTimeout = receiveTimeout; 
    binding.CloseTimeout = closeTimeout; 

    return binding; 

Выход аутентификации CSCRIPT является ...

NTAuthenticationProviders  : (STRING) "Negotiate,NTLM" 

Служба устанавливается требовать членства сетевой группы для который пользовательский член является членом (PrincipalPermission).

Как указано в комментариях ниже, я просмотрел журнал событий безопасности и обнаружил, что, когда пользователь (сетевая учетная запись) подключается как клиент к службе WCF на главной машине, есть запись, в которой жалуется, что учетная запись не удалась logon - передается NULD SID.

An account failed to log on. 

Subject: 
    Security ID:  NULL SID 
    Account Name:  - 
    Account Domain:  - 
    Logon ID:  0x0 

Logon Type:   3 

Account For Which Logon Failed: 
    Security ID:  NULL SID 
    Account Name:  *<network account>* 
    Account Domain:  *<account domain>* 

Failure Information: 
    Failure Reason:  An Error occured during Logon. 
    Status:   0xc000006d 
    Sub Status:  0x0 

Вопрос в том, почему это происходит?

+0

Проверьте конфигурацию клиента HTTP: // StackOverflow .com/questions/1134119/how-to-force-a-net-wcf-client-to-use-ntlm-in-an-basichttpbinding –

+0

У клиента нет конфигурации - это DLL, поэтому настройка выполняется программно. Строка binding.Security.Transport.ClientCredentialType выполняет настройку в NTLM. Я считаю, что проблема связана с тем, что я запускаю клиентский код на сервере, на котором размещается служба, поскольку это работает в другом месте. Я просто не знаю, что изменить. – anonymouse

+0

Я также пытался сменить клиента на использование Windows, а не NTLM. Получите аналогичный откат, но с Ntlm обменялся с Negotiate в сообщении об ошибке. Я уверен, что это проблема «только на сервере», возможно, WCF, возможно, конфигурация IIS и т. Д. – anonymouse

ответ

1

Метод 1 на этом post делает трюк ...

DisableStrictNameChecking = 1 BackConnectionHostNames = в моем случае, полное доменное имя квалифицированное псевдоним для сервера

Смежные вопросы