WCF: запрос на токен безопасности не может быть удовлетворен, поскольку проверка подлинности не удалась
Я написал очень простую службу WCF, которая отправляет и получает сообщения. Я протестировал приложение с помощью сервера веб-сервера VS 2008 по умолчанию, и все работает нормально. Но когда я развертываю службу WCF на другой компьютер IIS, я получаю следующую ошибку:
"Запрос на токен безопасности не может быть удовлетворен, поскольку проверка подлинности не удалась."
Как настроить тип аутентификации для использования моего пользовательского имени пользователя и пароля в файле конфигурации?
Если это невозможно, сообщите мне, как я могу установить учетные данные для Windows, потому что 2 компьютера, которые я использую, не используют одни и те же пользователи.
Ответы
Ответ 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, в то время как вы идете на отладку, оно выдает это исключение.
надеюсь, что это поможет.