Подтвердить что ты не робот

WCF: запрос на токен безопасности не может быть удовлетворен, поскольку проверка подлинности не удалась

Я написал очень простую службу WCF, которая отправляет и получает сообщения. Я протестировал приложение с помощью сервера веб-сервера VS 2008 по умолчанию, и все работает нормально. Но когда я развертываю службу WCF на другой компьютер IIS, я получаю следующую ошибку:

"Запрос на токен безопасности не может быть удовлетворен, поскольку проверка подлинности не удалась."

Как настроить тип аутентификации для использования моего пользовательского имени пользователя и пароля в файле конфигурации? Если это невозможно, сообщите мне, как я могу установить учетные данные для Windows, потому что 2 компьютера, которые я использую, не используют одни и те же пользователи.

4b9b3361

Ответ 1

Вам необходимо отключить защиту для привязки. В противном случае я считаю, что по умолчанию wsHttpBinding попытается согласовать токен безопасности (SCT).

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

<endpoint address="" 
          binding="wsHttpBinding" 
          contract="HelloWorldService.IService1"
          bindingConfiguration="TheBindingConfig">

Затем добавьте что-то вроде следующей конфигурации привязки сразу после раздела <services> в разделе web.config <system.serviceModel>.

<bindings>
  <wsHttpBinding>
    <binding name="TheBindingConfig">
      <security mode="None" />
    </binding>
  </wsHttpBinding>
</bindings>

Настройка безопасности на "Нет" - это ключ.

Надеюсь, это помогло!


Это помогло мне, но не сразу видно, как добавить к концу сервиса (ясно, как только вы сделали то, что нужно, но только после того, как вы это сделали). Причина, по которой это не совсем очевидно, состоит в том, что по умолчанию нет раздела привязок, тогда как в клиенте может быть один.

Итак, просто чтобы быть предельно ясным - в конце службы добавьте раздел привязок (как описано выше), а затем в соответствующую конечную точку добавьте атрибут bindingConfiguration = "TheBindingConfig". Очевидно, как только вы это сделали один раз...

Ответ 2

На самом деле вам не нужно отключать безопасность, и в некоторых случаях вам не следует. В пределах привязкиConfiguration вы можете указать уровень безопасности сообщений, который не устанавливает контекст безопасности следующим образом:

<security mode="Message">
    <transport clientCredentialType="Windows" proxyCredentialType="None"
                        realm="" />
    <message clientCredentialType="Windows" negotiateServiceCredential="true"
        algorithmSuite="Default" establishSecurityContext="false" />
</security>

Обратите внимание на атрибут installSecurityContext. Как клиент, так и служба должны иметь конфигурацию безопасности с установленным значением установленного уровня безопасности. Значение true также отлично работает, но false рекомендуется в среде, где серверы сбалансированы по нагрузке.

Ответ 3

Обязательно установите этот bindingConfiguration (указывающий режим безопасности "none" ) на и клиенте и сервере, иначе вы получите это сообщение - это довольно красная селедка, поскольку отладка проблема.

Сообщение не может быть обработано. Это, скорее всего, потому, что действие 'http://tempuri.org/IInterfaceName/OperationName' неверно или потому, что сообщение содержит недействительный или истек токен контекста безопасности или потому, что существует несоответствие между привязками. Ток контекста безопасности был бы недействительно, если служба прервала каналом из-за бездействия. Предотвращать услуга от прерывания простоя сессии преждевременно увеличивают Тайм-аут приема на услугу привязка к конечной точке.

Ответ 4

Если вы находитесь в режиме отладки, установите атрибут отладки как

<serviceDebug includeExceptionDetailInFaults="true"/>

по умолчанию он устанавливает как false.so, в то время как вы идете на отладку, оно выдает это исключение.

надеюсь, что это поможет.