WCF提供不安全或错误安全的错误

时间:2009-09-27 22:02:41

标签: c# wcf

我正在尝试使用远程svc Web服务。我使用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.csobj.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>

21 个答案:

答案 0 :(得分:130)

这是WCF服务抛出的一个非常模糊的错误。问题是WCF无法验证传递给服务的消息的安全性。

这几乎总是因为服务器时间偏差。远程服务器和客户端的系统时间必须在(通常)彼此相差10分钟之内。如果不是,安全验证将失败。

我打电话给eloqua.com,了解他们的服务器时间,并将其与服务器时间进行比较。

答案 1 :(得分:22)

虽然您的问题已通过上述解决方案之一解决,但为了其他人的利益,这是另一种选择。

当不正确的凭据传递时,您也可以将此异常发送到使用用户名消息凭据的基本端点(SOAP 1.1)。例如,如果您从代码调用服务并执行以下操作:

var service = new TestService();

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

这与WSHTTP端点(SOAP 1.2)不同,后者在传递无效凭据时抛出AccessDeniedException。我个人觉得这里包含的信息有点误导(因为这个原因我第一次遇到它时肯定花了几分钟)但是一旦我查阅了WCF诊断跟踪日志,其根本原因很明显。

答案 2 :(得分:13)

您显然遇到了WCF安全子系统的问题。你使用什么装订?什么认证?加密?登录?你必须越过域名界限吗?

如果客户端和服务器的时钟不同步(超过大约5分钟),则有些令人眩目的进一步显示其他人正在遇到此错误,因为某些安全模式依赖于同步时钟。

答案 3 :(得分:5)

同样的问题,我面临的客户端应用程序是WinForms应用程序C#4.0

当我在这里阅读解决方案时,我检查了Date&amp;客户端计算机的时间,但这是正确的,当前时间显示,但我仍然面临着这些问题。

经过一些处理后我发现选择了错误的时区,我在印度,时区是加拿大,主机服务器位于科威特。

我发现系统将时间转换为通用时间。

当我将时区更改为印度的时区时,问题就出现了问题。

答案 4 :(得分:4)

如果您从客户端传递用户凭据(如下面的代码块所示),那么它应该与服务器上的用户名/密码匹配。否则你会收到这个错误。

仅供参考,在我的情况下,我使用“basicHTTPAuthentication”和“TransportWithMessageCredential”安全模式。 WCF服务托管在IIS上的https。

var service = new TestService();

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

希望这会对某人有所帮助...... :)

答案 5 :(得分:3)

尝试将安全模式更改为“传输”。

安全标记和传输标记之间存在不匹配。

答案 6 :(得分:2)

对于它的价值 - 我也遇到了这个错误,发现它是由Web服务web.config中的连接字符串设置为连接到错误的机器引起的。

答案 7 :(得分:2)

就我而言,当我将wshttpbinding协议从https更改为http时,它开始工作。

答案 8 :(得分:2)

In my case I was using certificates for authentication with certificateValidationMode set to "PeerTrust" and I had forgotten to install the client certificate in windows store (LocalMachine\TrustedPeople) to make it accepted by the server.

答案 9 :(得分:1)

在我的情况下,我在我的测试客户端 - 服务器应用程序中的同一台机器上收到此错误。但是,“更新服务参考”解决了这个问题。

  • Tushar G. Walavalkar

答案 10 :(得分:1)

我也从过时的服务引用中遇到了这个问题,即使服务器和服务器也是如此。客户端在同一台机器上。如果出现问题,运行“更​​新服务参考”通常会修复它。

答案 11 :(得分:1)

只是为了分享...我有一个罕见的案例让我抓了几分钟后脑袋。即使倾斜解决方案非常准确,我之前解决了这个问题,这次也不同了。我在一台新的Win8.1机器上,我记得有时区问题,我手动调整了时间。好吧,我不断得到错误,尽管服务器和客户端显示的时间只有几秒钟的差异。我所做的是激活夏季节约选项&#34; (注意我确实在夏季节省时间,但手动设置时间)在&#34;日期和时间设置&#34;然后去了互联网时间部分并刷新......我的电脑中的时间保持不变,但错误消失了。

希望这对任何人都有用!

答案 12 :(得分:1)

大多数情况下,当服务器中存在某些错误,最常见的错误是身份验证数据库的配置或身份验证时,会发生此异常。在我的情况下,有不同的时钟同步 确保客户端和服务器具有相同的设置

点击右下方的时间 - &gt; “更改日期时间设置......” - &gt; “互联网时间”标签 - &gt;更改设置... - &gt;如果未选中,请选中“与Internet时间服务器同步”选项 - &gt; 从服务器下拉列表中选择“times.windows.com” - &gt;立即更新 - &gt;行

答案 13 :(得分:0)

在我的情况下,服务器时间不正确。因此,我将服务器的日期时间设置更改为“自动设置时间”,它解决了该问题。

答案 14 :(得分:0)

就我而言,这是IIS应用程序池上的设置。

选择应用程序池->高级设置->将“启用32位应用程序”设置为True。

然后回收应用程序池。

答案 15 :(得分:0)

我必须在它工作之前将SecurityMode更改为Message(WSHttpBinding)。即

SELECT c.courseExecutionID, c.beginDate, c.endDate, co.title, co.price, co.title

答案 16 :(得分:0)

&#13;
&#13;
<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>
&#13;
&#13;
&#13;

答案 17 :(得分:0)

由于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 :(得分:0)

试试这个:

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  

答案 19 :(得分:0)

确保在打开客户端后您的SendTimeout尚未过去。

答案 20 :(得分:0)

在我的情况下,有两个问题会抛出此异常。

请注意,我的环境使用Single Sign On(或STS,如果您愿意)通过ASP.NET MVC站点对用户进行身份验证。 MVC站点通过先前使用Bootstrap令牌传递它从STS服务器请求的承载令牌,对我的服务端点进行服务调用。我得到的错误是我从MVC网站发出服务电话。

  1. 我的SSO(或STS,如果您愿意)未将WCF服务配置为信赖方。

  2. 未正确配置服务配置。特别是在syste.identityModel的audienceUris节点上。它必须与服务端点URL完全匹配。

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