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