Сервер отклонил учетные данные клиента, WCF как служба Windows

Я могу подключиться к моей службе WCF с помощью приложения Win-form, однако я не могу сделать это с помощью службы windows. Всякий раз, когда я открываю огонь () для прокси, он выдает следующую ошибку

сервер отклонил учетные данные клиента

Внутреннее Исключение: Система.Безопасность.Идентификация.InvalidCredentialException: сервер отклонил учетные данные клиента.
---> Система.ComponentModel.Win32Exception: попытка входа в систему не удалось
--- Конец внутренней трассировки стека исключений - - -
в системе.Сеть.Безопасность.NegoState.ProcessAuthentication (LazyAsyncResult lazyResult)
в системе.Сеть.Безопасность.Переговоры.AuthenticateAsClient (NetworkCredential учетных данных, ChannelBinding привязки, строки имя_ цели, уровень защиты requiredProtectionLevel, TokenImpersonationLevel allowedImpersonationLevel)
в системе.Сеть.Безопасность.Переговоры.AuthenticateAsClient (NetworkCredential мандатный, Строка targetName, уровень защиты requiredProtectionLevel, TokenImpersonationLevel allowedImpersonationLevel)
в системе.Средство servicemodel.Каналы.WindowsStreamSecurityUpgradeProvider.WindowsStreamSecurityUpgradeInitiator.OnInitiateUpgrade (Поток поток, SecurityMessageProperty & remoteSecurity)

пробовал искать решение, но ни один из них не соответствует моим требованиям, поэтому опубликовано.

пожалуйста, помогите...

обновление 1:

@А. Р., попытался с помощью

client.ClientCredentials.Windows.AllowedImpersonationLevel =
    System.Security.Principal.TokenImpersonationLevel.Impersonation;

но безрезультатно.

обновление 2:

конфигурация службы WCF

<system.serviceModel>
    <diagnostics performanceCounters="All" />
    <bindings>
      <netTcpBinding>
        <binding name="myBindingForLargeData" maxReceivedMessageSize="5242880" maxConnections="10">
          <readerQuotas maxDepth="64" maxStringContentLength="5242880" maxArrayLength="16384"
                        maxBytesPerRead="4096" maxNameTableCharCount="16384"/>
        </binding>
      </netTcpBinding>
    </bindings>
    <services>
      <service behaviorConfiguration="WCFService.ServiceBehavior"
        name="WCFService.CollectorService">
        <endpoint address="" binding="netTcpBinding" bindingConfiguration="myBindingForLargeData"
          name="netTcpEndPoint" contract="WCFService.ICollectorService" />
        <endpoint address="mex" binding="mexTcpBinding" bindingConfiguration=""
          name="mexTcpEndPoint" contract="IMetadataExchange" />
        <host>
          <baseAddresses>
            <add baseAddress="net.tcp://localhost:8010/WCFService.CollectorService/" />
          </baseAddresses>
        </host>
      </service>
    </services>
    <behaviors>
      <serviceBehaviors>
        <behavior name="WCFService.ServiceBehavior">
          <serviceMetadata httpGetEnabled="False"/>
          <serviceDebug includeExceptionDetailInFaults="True" />
          <serviceThrottling
          maxConcurrentCalls="32"
          maxConcurrentSessions="32"
          maxConcurrentInstances="32"
           />
        </behavior>
      </serviceBehaviors>
    </behaviors>
</system.serviceModel>

4 ответов


Спасибо за вашу помощь. я получил ответ после нескольких дней некоторых исследований и пробного метода N ошибок:) ну, я знаю, что опоздал опубликовать ответ, но я думаю, что лучше поздно, чем никогда.

Итак, вот решение

мне пришлось внести некоторые изменения в Мои файлы конфигурации (клиент и сервер)

на стороне клиента я добавил <security> тег, как показано ниже

  <system.serviceModel>
    <bindings>
      <netTcpBinding>
        <binding name="netTcpEndPoint" closeTimeout="00:01:00" openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:10:00" transactionFlow="false" transferMode="Buffered" transactionProtocol="OleTransactions" hostNameComparisonMode="StrongWildcard" listenBacklog="10" maxBufferPoolSize="5242880" maxBufferSize="5242880" maxConnections="15" maxReceivedMessageSize="5242880">
          <readerQuotas maxDepth="32" maxStringContentLength="5242880" maxArrayLength="16384" maxBytesPerRead="4096" maxNameTableCharCount="16384" />
          <reliableSession ordered="true" inactivityTimeout="00:10:00" enabled="false" />
         <security mode="Transport">
            <transport clientCredentialType="Windows" protectionLevel="EncryptAndSign" />
            <message clientCredentialType="Windows" />
          </security>
        </binding>
      </netTcpBinding>
    </bindings>
    <client>
      <endpoint address="net.tcp://xx.xx.xx.xx:8010/WCFService.CollectorService/" binding="netTcpBinding" bindingConfiguration="netTcpEndPoint" contract="CloudAdapter.CloudCollectorService.ICollectorService" name="netTcpEndPoint">
      </endpoint>
    </client>
  </system.serviceModel>

а также добавил тот же тег на стороне сервера (служба WCF конфигурация), как показано ниже

<bindings>
  <netTcpBinding>
    <binding name="myBindingForLargeData" maxReceivedMessageSize="5242880" maxConnections="10">
      <readerQuotas maxDepth="64" maxStringContentLength="5242880" maxArrayLength="16384"
                    maxBytesPerRead="4096" maxNameTableCharCount="16384"/>
         <security mode="Transport">
        <transport clientCredentialType="Windows" protectionLevel="EncryptAndSign" />
        <message clientCredentialType="Windows" />
      </security>
    </binding>
  </netTcpBinding>
</bindings>

надеюсь, это поможет нуждающемуся человеку:)

таким образом, ключ должен сделать <security> тег же над клиентом и файлами конфигурации сервера.


в основном происходит то, что ваша вызывающая служба не имеет соответствующих учетных данных, как это было бы при вызове из WinForms. Что тебе нужно, так это немного подражания. Это требует немного настройки и немного раздражает, но это будет работать.

к счастью, MSDN имеет хорошее небольшое пошаговое руководство.
http://msdn.microsoft.com/en-us/library/ms731090.aspx

существует более общая информация по этой теме здесь:
http://msdn.microsoft.com/en-us/library/ms730088.aspx

обновление:
Установка флагов олицетворения недостаточно. Вы должны на самом деле олицетворять учетные данные, чтобы заставить его работать. Например:

  // Let's assume that this code is run inside of the calling service.
  var winIdentity = ServiceSecurityContext.Current.WindowsIdentity;
  using (var impContext = winIdentity.Impersonate())
  {
    // So this would be the service call that is failing otherwise.
    return MyService.MyServiceCall();
  }

какой режим аутентификации вы используете в своей службе WCF? Похоже, что приложение winform работает и предоставляет правильные учетные данные, пока ваша служба windows не работает с указанными привилегиями или передаваемые учетные данные недействительны. Попробуйте проверить свой запрос с помощью Fiddler, когда из вас winforms vs Windwos service и увидеть разницу.


проверить мой ответ на этот пост сервер отклонил учетные данные клиента.

обратите внимание на узел безопасности.

<bindings>
  <netTcpBinding>
    <binding name="customTcpBinding" maxReceivedMessageSize="20480000" transferMode="Streamed" >
      <security mode="None"></security>
    </binding>
  </netTcpBinding>
</bindings>