WCF给出一个不安全的或不正确的安全故障错误

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

从另一方收到一个不安全的错误或不正确的安全错误。 查看内部故障例外,了解故障代码和详细信息。

System.ServiceModel.FaultException:validation消息的安全性时发生错误

我没有创buildWCF端,这是一个远程的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文件。 我正在使用obj.ServiceCredentials.UserName.UserName="xxxxxx".Password="xxxXx"在我的consoleApp.cs文件中提供用户名和密码。

 <?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> 

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

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

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

虽然你的问题是用上述解决scheme之一解决的,但为了别人的利益,这里还有另外一个select。

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

 var service = new TestService(); service.ClientCredentials.UserName.UserName = "InvalidUser"; service.ClientCredentials.UserName.Password = "InvalidPass"; 

这与WSHTTP端点(SOAP 1.2)有所不同,当无效凭证通过时,会引发AccessDeniedException 。 我个人发现这里包含的信息有点误导(我第一次遇到这个问题肯定花了我几分钟的时间),但是一旦我咨询了WCF诊断跟踪日志,根本的原因就清楚了。

你显然有一个WCF安全子系统的问题。 你用什么绑定? 什么authentication? encryption? login? 你必须跨越领域的界限吗?

有些护目镜进一步显示,如果客户端和服务器的时钟不同步(大约五分钟以上),其他人正在经历这个错误,因为一些安全模式依赖于同步的时钟。

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

仅供参考,就我而言,我正在使用“basicHTTPAuthentication”和“TransportWithMessageCredential”安全模式。 WCF服务托pipe在https上的IIS中。

 var service = new TestService(); service.ClientCredentials.UserName.UserName = "InvalidUser"; service.ClientCredentials.UserName.Password = "InvalidPass"; 

希望这将有助于某人… 🙂

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

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

经过一些变通后,我发现错误的时区select,我在印度和时区是加拿大,主机服务器位于科威特。

我发现系统将时间转换为世界时间。

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

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

您在安全标签和运输标签之间不匹配。

对于它的价值 – 我也有这个错误,发现它是由Web服务web.config中的连接string被设置为连接到错误的机器引起的。

在我的情况下,当我从https更改wshttpbinding协议到http开始工作。

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

在我的情况下,我在我的testing客户端 – 服务器应用程序在同一台机器上得到这个错误。 但是这个问题已经通过“更新服务参考”得到了解决。

  • 图萨尔·瓦拉瓦尔卡尔

在我的情况下,我使用的证书certificateValidationMode设置为“PeerTrust”进行身份validation,我忘记安装在Windows存储(LocalMachine \ TrustedPeople)客户端证书,以使其接受服务器。

只是为了分享…我有一个罕见的案例,让我挠了脑袋几分钟。 即使时间偏斜的解决scheme是非常准确的,我以前解决了这个问题,这一次是不同的。 我在一个新的Win8.1机器上,我记得有一个时区问题,我已经手动调整时间。 那么,尽pipe在服务器和客户端显示的时间只有几秒钟,我仍然得到错误。 我所做的是在“date和时间设置”中激活“夏季储蓄选项”(注意,我确实在夏季节省时间,但有时间设置手动),然后去互联网时间部分,刷新…时间我的电脑保持完全一样,但错误消失。

希望这对任何人都有用!

就我而言,有两个问题会引发这个exception。

请注意,我的环境使用Single Sign On(或者,如果您愿意,可以使用STS)来通过ASP.NET MVC网站对用户进行身份validation。 MVC站点反过来通过先前从Bootstrap令牌向STS服务器请求的不记名令牌,对我的服务端点进行服务调用。 我得到的错误是当我从MVC网站进行服务调用。

  1. WCF服务没有在我的SSO中configuration为依赖方(如果您愿意,也可以是STS)。

  2. 服务的configuration没有正确configuration。 尤其是在系统身份模型的受众使用者节点上。 它必须完全匹配服务端点url。

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

确保您的SendTimeout在打开客户端之后没有过去。

我得到这个错误,由于BasicHttpBinding不发送一个兼容的messageVersion到我打电话的服务。 我的解决scheme是使用像下面的自定义绑定

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

试试这个:

 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 

大多数情况下,当服务器出现一些错误时,会发生这种exception,最常见的是authentication数据库或authentication的错误configuration。 在我的情况下,有不同的时钟同步,确保客户端和服务器具有相同的设置

点击右下angular的时间 – >“更改date时间设置…” – >“互联网时间”选项卡 – >更改设置… – >检查“同步互联网时间服务器”选项,如果它是未选中 – >从服务器下拉列表中select“times.windows.com” – >立即更新 – >确定

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