Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/313.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# WCF给出了不安全或不正确安全的故障错误_C#_Wcf - Fatal编程技术网

C# WCF给出了不安全或不正确安全的故障错误

C# WCF给出了不安全或不正确安全的故障错误,c#,wcf,C#,Wcf,我正在尝试使用远程svc web服务。我使用svcuti.exe创建了代理类,之后我将该类添加到控制台应用程序中,但它会产生一个错误: 从另一方收到未加密的错误或未加密的错误。有关故障代码和详细信息,请参见内部故障异常 System.ServiceModel.FaultException:验证消息安全性时出错 我没有创建WCF端,它是一个远程svc。请帮忙 这是我的app.config文件。我使用obj.servicecdentials.username.username=“xxxxxx”和

我正在尝试使用远程svc web服务。我使用
svcuti.exe
创建了代理类,之后我将该类添加到控制台应用程序中,但它会产生一个错误:

从另一方收到未加密的错误或未加密的错误。有关故障代码和详细信息,请参见内部故障异常

System.ServiceModel.FaultException:验证消息安全性时出错

我没有创建WCF端,它是一个远程svc。请帮忙


这是我的
app.config
文件。我使用
obj.servicecdentials.username.username=“xxxxxx”
.password=“xxxXx”
在我的
consoleApp.cs
文件中提供用户名和密码


您的WCF安全子系统显然存在问题。你用的是什么装订?什么认证?加密?签字?您必须跨越域边界吗


如果客户端和服务器的时钟不同步(超过大约五分钟),那么稍微看一下就会发现其他人正在经历这个错误,因为一些安全模式依赖于同步的时钟

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


安全标签和传输标签不匹配。

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

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


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

即使服务器和客户端在同一台机器上,由于服务引用已过时,我也遇到了这个问题。如果出现此问题,运行“更新服务引用”通常会解决此问题。

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

  • 图萨·G·瓦拉瓦卡尔

值得一提的是-我也遇到了这个错误,并发现它是由web services web.config中的连接字符串被设置为连接到错误的机器造成的。

尽管您的问题通过上述解决方案之一得到了解决,但为了其他人的利益,这里还有另一个选项

如果将不正确的凭据传递给与您一样使用用户名消息凭据的基本端点(SOAP 1.1),也会出现此异常。例如,如果您从代码调用服务并执行以下操作:

var service = new TestService();

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

这与WSHTTP端点(SOAP 1.2)不同,后者在传递无效凭据时抛出
AccessDeniedException
。我个人认为本文中包含的信息有点误导(因为这个原因,我第一次遇到它肯定要花费几分钟时间),但在我查阅WCF诊断跟踪日志后,根本原因就很清楚了。

在我的案例中,当我将
wshttpbinding
协议从
https
更改为
http
时,它开始工作。

如果您从客户端传递用户凭据(按照下面的代码块),那么它应该与服务器上的用户名/密码匹配。否则您将得到此错误

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


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

我面临的这个问题与我的客户端应用程序是WinForms应用程序C#4.0相同

当我阅读这里的解决方案时,我检查了客户端计算机的日期和时间,但这是正确的,并且显示了当前时间,但我仍然面临这些问题

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

我发现这个系统把时间转换成世界时间


当我将时区更改为印度时区时,问题就解决了。

在我的例子中,有两个问题会引发此异常

请注意,我的环境使用单点登录(或STS,如果您愿意)通过ASP.NET MVC站点对用户进行身份验证。MVC站点反过来通过传递承载令牌向我的服务端点进行服务调用,该承载令牌是它以前使用引导令牌从STS服务器请求的。我得到的错误是当我从MVC站点拨打服务电话时

  • WCF服务未在我的SSO(或STS,如果您愿意)中配置为依赖方

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

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

  • 确保您的
    SendTimeout
    在打开客户端后未过期

    试试这个:

    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  
    

    由于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>
    

    在我的案例中,我使用证书进行身份验证,证书EvalidationMode设置为“PeerTrust”,而我忘记了在windows应用商店中安装客户端证书(
     <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>
    
    _wcf = new ServiceRequestClient(new WSHttpBinding(SecurityMode.Message),                     
           new EndpointAddress(_wcfRequestServerAddress));