Сервер отклонил учетные данные клиента - PullRequest
19 голосов
/ 20 декабря 2011

У меня есть служба WCF с привязкой net.tcp, размещенная на сервере в качестве службы Windows. Я не могу получить доступ к этой услуге. Однако я смог это сделать, когда разместил его в своей локальной сети.

Ошибка получена

Сообщение: ** Сервер отклонил учетные данные клиента.

Внутреннее исключение:

System.Security.Authentication.InvalidCredentialException:
The server has rejected the client credentials.
---> System.ComponentModel.Win32Exception:
The logon attempt failed --- End of inner exception stack trace
--- at System.Net.Security.NegoState.ProcessAuthentication(LazyAsyncResult lazyResult)
at System.Net.Security.NegotiateStream.AuthenticateAsClient(NetworkCredential credential, ChannelBinding binding, String targetName, ProtectionLevel requiredProtectionLevel, TokenImpersonationLevel allowedImpersonationLevel)
at System.Net.Security.NegotiateStream.AuthenticateAsClient(NetworkCredential credential, String targetName, ProtectionLevel requiredProtectionLevel, TokenImpersonationLevel allowedImpersonationLevel)
at System.ServiceModel.Channels.WindowsStreamSecurityUpgradeProvider.WindowsStreamSecurityUpgradeInitiator.OnInitiateUpgrade(Stream stream, SecurityMessageProperty& remoteSecurity)

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

В чем может быть проблема?

Если я установлю свой режим безопасности на None на клиенте

<security mode="None"></security>

Я получаю еще одну ошибку:

Ошибка: Соединение с сокетом было прервано. Это может быть вызвано ошибкой обработки вашего сообщения или превышением тайм-аута приема удаленным хостом, или проблемой основного сетевого ресурса. Тайм-аут локального сокета был '00: 00: 59.5149722 '.

Ответы [ 7 ]

27 голосов
/ 13 января 2012

У меня была такая же проблема, когда я пытался заставить сервер в DMZ общаться со службой в моей сети.Решение, которое исправило это для меня, состояло в том, чтобы добавить следующее в app.config:

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

<bindings>
  <netTcpBinding>
    <binding name="customTcpBinding" maxReceivedMessageSize="20480000" transferMode="Streamed" >
      <security mode="None"></security>
    </binding>
  </netTcpBinding>
</bindings>
6 голосов
/ 31 декабря 2011

Ошибка является ошибкой TokenImpersonation.

Похоже, что происходит, что входящий вызов, некоторый код на стороне сервера требует, чтобы пользователь олицетворял код сервера.

Код сервера выполняется как локальная системная учетная запись, поэтому он не может выдать себя за пользователя домена.

У вас есть 2 основных варианта:

  • Запустить службу в безопасностиконтекст пользователя, которому разрешено выдавать себя за другого пользователя
  • Переписать приложение так, чтобы олицетворение не требовалось
3 голосов
/ 16 февраля 2012

Я знаю, что на это уже ответили "выключить безопасность".Но в случае, если кому-то это интересно, мне удалось получить проверку подлинности Windows WCF для транспорта с помощью NetTcpBinding в среде интрасети, работающую самостоятельно после большой боли.

В сущности, все сводилось к использованию этой конфигурации:

<security mode="Transport">
  <transport clientCredentialType="Windows" />
</security>

Более подробную информацию вы можете увидеть в сообщении в блоге Проверка подлинности Windows WCF с использованием NetTcpBinding в интрасети.окружающая среда .

2 голосов
/ 05 июня 2013

Наше приложение на базе Windows подключается к службе WCF в локальной интрасети.Уровень безопасности был установлен для проверки подлинности Windows.Мы иногда получаем эту ошибку.В ходе расследования мы выяснили, что срок действия пароля Windows истек.После смены пароля все работало как обычно ...

Это простая проверка, если вы время от времени получаете эту ошибку.

1 голос
/ 10 января 2012

Похоже, что клиентский запрос не аутентифицирован на сервере. Вы можете найти полезную информацию здесь и здесь .

0 голосов
/ 26 сентября 2018

Как и @vonbalaji, я видел это, когда учетная запись была заблокирована из-за неправильного ввода пароля несколько раз.

0 голосов
/ 16 января 2012

Вторая ошибка, которую вы получили, когда «Разъем соединения был прерван», обычно возникает, когда вы пытаетесь перекачать слишком много данных из вашего сервиса.

Я рекомендую олицетворение пользователя, чтобы сначала правильно заработать учетные данные, а затем подумать о напоминании о проблеме.

Полезную информацию об олицетворении можно найти в Как: Выдавать себя за клиента в службе .

...