Произошла ошибка при проверке безопасности сообщения

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

Когда я удаляю пользовательскую аутентификацию, служба работает без проблем. Я не могу понять, что я неправильно настроил в своем web.config. Любое понимание будет оценено.

  <system.serviceModel>
     <services>
        <service behaviorConfiguration="NAThriveExtensions.nableAPIBehavior"
          name="NAThriveExtensions.nableAPI">
           <endpoint 
             address="" 
             binding="basicHttpBinding" 
             bindingConfiguration="basicHttpBinding_Secure"
             contract="NAThriveExtensions.InableAPI">
           </endpoint>
           <endpoint 
             address="mex" 
             binding="mexHttpsBinding" 
             contract="IMetadataExchange" />
        </service>
     </services>
     <behaviors>
        <serviceBehaviors>
          <behavior name="NAThriveExtensions.nableAPIBehavior">
            <serviceMetadata httpsGetEnabled="true" />
            <serviceDebug includeExceptionDetailInFaults="false" />
            <serviceCredentials>
              <userNameAuthentication 
                userNamePasswordValidationMode="Custom" 
              customUserNamePasswordValidatorType= "NAThriveExtensions.Authentication, NAThriveExtensions" />
            </serviceCredentials>
          </behavior>
        </serviceBehaviors>
     </behaviors>
     <bindings>
       <basicHttpBinding>
         <binding name="basicHttpBinding_Secure">
           <security mode="TransportWithMessageCredential">
             <message clientCredentialType="UserName"/>
           </security>
         </binding>
       </basicHttpBinding>
     </bindings>
  </system.serviceModel>

person Matt Klepeis    schedule 21.09.2010    source источник


Ответы (8)


Я получал такое же сообщение об ошибке, и оказалось, что это связано с разницей во времени между моей рабочей станцией и сервером, на котором размещена служба WCF. Сервер отставал от моей машины примерно на 10 минут, и безопасности WCF это, похоже, не очень нравится.

Чтобы найти корень проблемы, я включил serviceSecurityAuditing в файле конфигурации сервера. Добавьте следующее в раздел configuration/system.serviceModel/behaviors/serviceBehaviors/behavior для вашей службы:

<serviceSecurityAudit 
    auditLogLocation="Application" 
    serviceAuthorizationAuditLevel="Failure" 
    messageAuthenticationAuditLevel="Failure" 
    suppressAuditFailure="true"/>

В этом мне помог следующий сайт:

http://blogs.microsoft.co.il/blogs/urig/archive/2011/01/23/wcf-quot-an-error-occurred-when-verifying-security-for-the-message-quot-and-service-security-audit.aspx

person Sam    schedule 07.03.2013
comment
Это отличный диагностический совет! Спасибо, что поделился. - person Tedford; 19.07.2013
comment
Это действительно отличный совет. Оказалось, что мне не хватало DLL, как описано здесь: Не удалось загрузить тип провайдера Entity Framework%23comment29085393_15358941">stackoverflow.com/questions/14033193/ - person ArieKanarie; 29.03.2017
comment
Хотел бы я проголосовать за это более одного раза! Пол дня пытался получить настоящее сообщение об ошибке. - person L_7337; 10.04.2017

Другая причина появления этого сообщения — не синхронизация некоторых из ваших машин по времени. WCF по умолчанию допускает пятиминутный перерыв; помимо этого, он выдает ошибку, если что-то не синхронизировано.

Решение состоит в том, чтобы синхронизировать все ваши машины. time.windows.com печально известен тем, что не работает, поэтому я предлагаю использовать что-то другое. (Если вы работаете в корпоративной среде, правильным выбором здесь может быть локальный контроллер домена.)

person ashes999    schedule 31.01.2014
comment
Большое спасибо! Я рвал на себе волосы, задаваясь вопросом, что это за проблема!! - person CaptainStealthy; 13.09.2014
comment
Рад, что не только я @Stealth22 :) - person ashes999; 13.09.2014
comment
Мой сервер и клиент были на одних и тех же часах. Часы клиента настроены автоматически, но часы сервера были установлены вручную. Я активировал автоматическую установку времени на сервере, и проблема решена. - person Oktay; 24.11.2016

Это оказалось проблемой на стороне потребителя, а не с самой службой. WebMethods 8 Software AG использовал этот сервер, но в службу не был добавлен обработчик безопасности, поэтому учетные данные не добавлялись в заголовок, что приводило к вышеупомянутой ошибке.

person Matt Klepeis    schedule 08.10.2010
comment
Как можно узнать, действительно ли это проблема? - person Maritim; 04.01.2013
comment
@Maritim: Хороший вопрос. Просмотр необработанного HTTP-запроса - лучший способ, который я знаю, например. регистрируя его, если он еще не зарегистрирован: отсутствующие (элементы) заголовка SOAP должны быть очевидны. - person J0e3gan; 02.08.2014

У меня была аналогичная проблема. Я строил свои строки в формате даты и времени, используя свое местное время, но мой сервис/сервер ожидал GMT.

Мне нужно было получить время по Гринвичу (JAVA):

final Date currentTime = new Date();    
final SimpleDateFormat sdf = 
new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'.000Z'");
sdf.setTimeZone(TimeZone.getTimeZone("GMT"));
System.out.println(sdf.format(currentTime));
person Pablo Chvx    schedule 17.03.2019

Я получал ту же ошибку на своем сервере IIS 7.5. Я забыл добавить разрешение на чтение закрытого ключа сертификата в пул приложений виртуальная учетная запись (например, IIS AppPool\ASP.NET v4.0).

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

(0x80131501 — ошибка при проверке безопасности сообщения.)

person ssg31415926    schedule 08.04.2013

Я получал ту же ошибку, и ничего из вышеперечисленного не помогло мне.

Наконец, я отследил его до connectionStrings в родительском файле web.config (моя служба была развернута в дочернем приложении на сайте администратора).

«Да» звучит нелепо, но как только я завернул строки подключения в родительский файл web.config с элементом местоположения, все заработало.

Для ясности в родительском web.config я изменил это

<connectionStrings>
    <add name="..." />
</connectionStrings>

к этому

<location path="." inheritInChildApplications="false">
    <connectionStrings>
        <add name="..." />
    </connectionStrings>
</location>

Обратите внимание, что эта ошибка также привела к очень бесполезному serviceSecurityAudit. сообщение журнала:

Ошибка аутентификации сообщения.
Служба: ...
Действие: http://schemas.xmlsoap.org/ws/2005/02/trust/RST/SCT
ClientIdentity:
ActivityId:
ArgumentNullException: значение не может быть нулевым.
Имя параметра : управляющий делами

person Dan    schedule 06.09.2016

Я получал ту же ошибку. Я забыл добавить разрешение на чтение для базы данных членства aspnetdb в (IIS APPPOOL\DefaultAppPool).

Ошибка аутентификации сообщения. Оказание услуг:....

Действие: http://schemas.xmlsoap.org/ws/2005/02/trust/RST/SCT

Идентификация клиента:

Идентификатор активности:

SqlException: не удается открыть базу данных aspnetdb, запрошенную при входе в систему. Вход не выполнен.

Ошибка входа для пользователя «IIS APPPOOL\DefaultAppPool».

person Yasser Mohammed    schedule 19.12.2016

Имя пользователя и пароль — это сервер, к которому вы подключаетесь, а не имя пользователя и пароль для входа в систему.

person MapleStory    schedule 23.12.2015