28

当我尝试调用 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>
4

8 回答 8

40

我收到了同样的错误消息,结果是由于我的工作站机器和托管 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-服务安全审计.aspx

于 2013-03-07T23:10:27.033 回答
19

此消息的另一个原因是您的某些机器未及时同步。默认情况下,WCF 允许有 5 分钟的间隔;除此之外,如果事情不同步,它会引发错误。

解决方案是同步所有机器。time.windows.com因不工作而臭名昭著,所以我建议使用其他东西。(如果您在公司环境中,本地域控制器可能是正确的选择。)

于 2014-01-31T16:30:52.130 回答
7

这最终成为消费端的问题,而不是服务本身。Software AG 的 webMethods 8 正在使用此服务器,但没有将安全处理程序添加到服务中,因此没有将凭据添加到标头中,从而导致上述错误。

于 2010-10-08T16:24:58.263 回答
1

我有一个类似的问题。我正在使用本地时间构建我的日期时间格式的字符串,但我的服务/服务器期待GMT

我需要获取 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));
于 2019-03-17T20:42:11.850 回答
0

我在 IIS 7.5 服务器上遇到了同样的错误。我忘记将证书私钥的读取权限添加到应用程序池虚拟帐户(例如 IIS AppPool\ASP.NET v4.0)。

有关信息,在测试帐户和权限的各种组合时,我注意到应用程序池需要回收才能失去对密钥的访问权限,一旦它被检索一次。

(0x80131501 - 验证消息的安全性时出错。)

于 2013-04-08T05:57:30.340 回答
0

我遇到了同样的错误,以上都对我没有帮助。

我最终将其追踪到父 web.config 中的 connectionStrings (我的服务被部署到管理站点的子应用程序)。

是的听起来很荒谬,但是一旦我将连接字符串包装在带有位置元素的父 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:值不能为空。
参数名称:经理

于 2016-09-06T12:30:15.447 回答
0

我遇到了同样的错误。我忘记将成员数据库 aspnetdb 的读取权限添加到 (IIS APPPOOL\DefaultAppPool)。

消息认证失败。服务:....

行动:http: //schemas.xmlsoap.org/ws/2005/02/trust/RST/SCT

客户身份:

活动编号:

SqlException:无法打开登录请求的数据库“aspnetdb”。登录失败。

用户 'IIS APPPOOL\DefaultAppPool' 登录失败。

于 2016-12-19T07:24:54.663 回答
-4

用户名和密码是您连接的服务器,而不是您的系统登录用户名和密码。

于 2015-12-23T09:05:04.530 回答