WCF дает незащищенную или неправильно защищенную ошибку ошибки

Я пытаюсь использовать удаленную веб-службу svc. Я создал прокси-класс с помощью svcutil.exe, и после этого я добавил этот класс в консольное приложение, но он дает ошибку:

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

System.ServiceModel.FaultException: произошла ошибка при проверке безопасности для сообщения

Я не создал сторону WCF, это удаленный svc. Пожалуйста, помогите.

<?xml version="1.0" encoding="utf-8"?>
<configuration>
    <system.serviceModel>
        <bindings>
            <basicHttpBinding>
                <binding name="EloquaDataTransferService" closeTimeout="00:01:00"
                    openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00"
                    allowCookies="false" bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard"
                    maxBufferSize="65536" maxBufferPoolSize="524288" maxReceivedMessageSize="65536"
                    messageEncoding="Mtom" textEncoding="utf-8" transferMode="Buffered"
                    useDefaultWebProxy="true">
                    <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"
                        maxBytesPerRead="4096" maxNameTableCharCount="16384" />
                    <security mode="TransportWithMessageCredential">
                        <transport clientCredentialType="None" proxyCredentialType="None"
                            realm="" />
                        <message clientCredentialType="UserName" algorithmSuite="Default" />
                    </security>
                </binding>
            </basicHttpBinding>
        </bindings>
        <client>
            <endpoint address="https://secure.eloqua.com/API/1.2/DataTransferService.svc"
                binding="basicHttpBinding" bindingConfiguration="EloquaDataTransferService"
                contract="DataTransferService" name="EloquaDataTransferService" />
        </client>
    </system.serviceModel>
</configuration>

Это мой файл app.config. Я предоставляю имя пользователя и пароль в файле consoleApp.cs с помощью obj.ServiceCredentials.UserName.UserName="xxxxxx" и .Password="xxxXx"

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
   <system.serviceModel>
      <bindings>
         <basicHttpBinding>
            <binding name="EloquaDataTransferService" closeTimeout="00:01:00" openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00" allowCookies="false" bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard" maxBufferSize="65536" maxBufferPoolSize="524288" maxReceivedMessageSize="65536" messageEncoding="Mtom" textEncoding="utf-8" transferMode="Buffered" useDefaultWebProxy="true">
               <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384" maxBytesPerRead="4096" maxNameTableCharCount="16384" />
               <security mode="TransportWithMessageCredential">
                  <transport clientCredentialType="None" proxyCredentialType="None" realm="" />
                  <message clientCredentialType="UserName" algorithmSuite="Default" />
               </security>
            </binding>
         </basicHttpBinding>
      </bindings>
      <client>
         <endpoint address="https://secure.eloqua.com/API/1.2/DataTransferService.svc" binding="basicHttpBinding" bindingConfiguration="EloquaDataTransferService" contract="DataTransferService" name="EloquaDataTransferService" />
      </client>
   </system.serviceModel>
</configuration>

Ответ 1

Это очень непонятная ошибка, которую бросают службы WCF. Проблема в том, что WCF не может проверить безопасность сообщения, которое было передано службе.

Это почти всегда из-за перекоса сервера. Удаленный сервер и время системы клиента должны находиться в пределах (обычно) 10 минут друг от друга. Если это не так, проверка безопасности не удастся.

Я бы назвал eloqua.com и узнал, что у них на сервере, и сравним это с вашим сервером.

Ответ 2

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

Вы также можете получить это исключение, когда неверные учетные данные передаются на базовую конечную точку (SOAP 1.1), которая использует учетные данные пользователя, как вы. Например, если вы вызываете службу из кода и делаете что-то вроде этого:

var service = new TestService();

service.ClientCredentials.UserName.UserName = "InvalidUser";
service.ClientCredentials.UserName.Password = "InvalidPass";

Это отличается от конечной точки WSHTTP (SOAP 1.2), которая выдает AccessDeniedException, когда пропускаются недопустимые учетные данные. Я лично считаю, что содержащееся здесь сообщение мало вводит в заблуждение (это, безусловно, стоило мне нескольких минут, когда я впервые столкнулся с этим по этой причине), но основная причина была ясна, когда я консультировался с журналами трассировки диагностики WCF.

Ответ 3

У вас, очевидно, проблема с подсистемой безопасности WCF. Какая привязка вы используете? Какая аутентификация? Шифрование? Подписание? Вам нужно пересечь границы домена?

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

Ответ 4

Такая же проблема, с которой я столкнулся с моим клиентским приложением, - это приложение WinForms С# 4.0

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

После некоторого рабочего дня я обнаружил, что выбран неправильный часовой пояс, я в Индии, а часовой пояс - в Канаде, хост-сервер находится в Кувейте.

Я обнаружил, что система преобразует время в универсальное время.

Когда я изменил часовой пояс в часовом поясе Индии, проблема была подобрана.

Ответ 5

Если вы передаете учетные данные пользователя от клиента (согласно приведенному ниже блоку кода), он должен совпадать с именем пользователя/паролем на сервере. в противном случае вы получите эту ошибку.

FYI, в моем случае я использую "basicHTTPAuthentication" с режимом безопасности "TransportWithMessageCredential". И служба WCF размещена в IIS на https.

var service = new TestService();

service.ClientCredentials.UserName.UserName = "InvalidUser";
service.ClientCredentials.UserName.Password = "InvalidPass";

Надеюсь, это поможет кому-то...:)

Ответ 6

Попробуйте изменить режим безопасности на "транспорт".

У вас есть несоответствие между тегом безопасности и транспортным тегом.

Ответ 7

Для чего это стоит - у меня также была эта ошибка и я обнаружил, что она была вызвана строкой соединения в веб-службах, где web.config настроен на подключение к неправильной машине.

Ответ 8

В моем случае, когда я изменил протокол wshttpbinding от https до http, он начал работать.

Ответ 9

В моем случае я использовал сертификаты для проверки подлинности с помощью параметра certificateValidationMode, установленного в "PeerTrust", и я забыл установить сертификат клиента в хранилище Windows (LocalMachine\TrustedPeople), чтобы сделать его принятым сервером.

Ответ 10

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

Нажмите "Время на стороне справа" → "Изменить параметры времени..." → "Время в Интернете" → Изменить настройки... → установите флажок "Синхронизировать с интернет-сервером времени" если он не установлен → из раскрывающегося списка сервера выберите "times.windows.com" → Обновить сейчас → ОК

Ответ 11

У меня также была эта проблема из справочной службы, устаревшей, даже с сервером и клиентом на том же компьютере. Запуск "Update Service Reference" обычно исправляет это, если это проблема.

Ответ 12

В моем случае я получал эту ошибку на той же машине, в своем тестовом клиент-серверном приложении. Но эта проблема была решена с помощью "Справочной службы обновления".

  • Тушар Г. Валабалкар

Ответ 13

Просто ради обмена... У меня был редкий случай, который заставил меня почесывать затылок на несколько минут. Даже в то время, когда решение по перекос было очень точным, и я решил эту проблему раньше, на этот раз было иначе. Я был на новой машине Win8.1, которую я помню, имея проблему с часовым поясом, и я вручную скорректировал время. Ну, я продолжал получать ошибку, несмотря на то, что время, отображаемое на сервере, и у клиента было только разницей в секундах. То, что я сделал, это активировать "летнее сохранение" (обратите внимание, что я действительно в летнее время, но при настройке времени вручную) в "настройке даты и времени" затем перешел в раздел времени в Интернете и обновил... время в мой компьютер сохранял то же самое, но ошибка исчезла.

Надеюсь, это полезно для всех!

Ответ 14

В моем случае есть две проблемы, которые будут генерировать это исключение.

Обратите внимание, что моя среда использует Single Sign On (или STS, если хотите) для аутентификации пользователя через сайт MVC ASP.NET. Сайт MVC, в свою очередь, вызывает вызов службы к моей конечной точке службы, передавая токен-носитель, который он запрашивал с сервера STS с токеном Bootstrap ранее. Ошибка, которую я получил, - это когда я сделал вызов службы с сайта MVC.

  • Служба WCF не была настроена как полагающаяся сторона в моем SSO (или STS, если вы предпочитаете).

  • Конфигурация сервиса не была настроена должным образом. В частности, для аудитории uris node для system.identityModel. Он должен точно соответствовать URL-адресу конечной точки службы.

    <system.identityModel>
        <identityConfiguration>
            <audienceUris>
                <add value="https://localhost/IdpExample.YService/YService.svc" />
            </audienceUris>
            ....
        </identityConfiguration>
    </system.identityModel>
    

Ответ 15

Убедитесь, что ваш SendTimeout не прошел после открытия клиента.

Ответ 16

Попробуйте следующее:

catch (System.Reflection.TargetInvocationException e1)  
      String excType   
      excType = e1.InnerException.GetType().ToString()  
      choose case excType  
                case "System.ServiceModel.FaultException"  
                          System.ServiceModel.FaultException e2  
                          e2 = e1.InnerException  
                          System.ServiceModel.Channels.MessageFault fault  
                          fault = e2.CreateMessageFault()  
                          ls_message = "Class: uo_bcfeWS, Method: registraUnilateral ~r~n" + "Exception(1): " + fault.Reason.ToString()   
                          if (fault.HasDetail) then  
                                    System.Xml.XmlReader reader  
                                    reader = fault.GetReaderAtDetailContents()  
                                    ls_message += " " + reader.Value  
                                    do while reader.Read()  
                                              ls_message += reader.Value  
                                    loop  
                          end if  
                case "System.Text.DecoderFallbackException"  
                          System.Text.DecoderFallbackException e3  
                          e3 = e1.InnerException  
                          ls_message = "Class: uo_bcfeWS, Method: registraUnilateral ~r~n" + "Exception(1): " + e3.Message   
                case else  
                          ls_message = "Class: uo_bcfeWS, Method: registraUnilateral ~r~n" + "Exception(1): " + e1.Message  
      end choose  
      MessageBox ( "Error", ls_message )  
      //logError(ls_message)  
      return false  

Ответ 17

Я получал эту ошибку из-за того, что BasicHttpBinding не отправлял совместимое messageVersion в службу, которую я вызывал. Мое решение состояло в том, чтобы использовать пользовательскую привязку, как показано ниже

 <bindings>
  <customBinding>
    <binding name="Soap11UserNameOverTransport" openTimeout="00:01:00" receiveTimeout="00:1:00" >
      <security authenticationMode="UserNameOverTransport">
      </security>          
      <textMessageEncoding messageVersion="Soap11WSAddressing10" writeEncoding="utf-8" />
      <httpsTransport></httpsTransport>
    </binding>
  </customBinding>      
</bindings>

Ответ 18

<wsHttpBinding>
        <binding name="ISG_Binding_Configuration" bypassProxyOnLocal="true" useDefaultWebProxy="false" hostNameComparisonMode="WeakWildcard" sendTimeout="00:30:00" receiveTimeout="00:30:00" maxReceivedMessageSize="2147483647" maxBufferPoolSize="2147483647">
          <readerQuotas maxArrayLength="2147483647" maxStringContentLength="2147483647" />
          <security mode="None">
            <message establishSecurityContext="false" clientCredentialType="UserName"/>
          </security>
        </binding>
      </wsHttpBinding>

Ответ 19

Мне пришлось изменить SecurityMode на Message (WSHttpBinding), прежде чем он сработает. т.е.

_wcf = new ServiceRequestClient(new WSHttpBinding(SecurityMode.Message),                     
       new EndpointAddress(_wcfRequestServerAddress));

Ответ 20

В моем случае это была настройка пула приложений IIS.

Выберите пул приложений → Расширенные настройки → Установите для параметра "Включить 32-разрядные приложения" значение True.

Затем перезапустите пул приложений.

Ответ 21

В моем случае время сервера не было правильным. Поэтому я изменил настройки Datetime сервера на Set time автоматически, и это решило проблему.