我正在尝试使用远程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.cs
和obj.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>
答案 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)
在我的情况下,我在我的测试客户端 - 服务器应用程序中的同一台机器上收到此错误。但是,“更新服务参考”解决了这个问题。
答案 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)
<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;
答案 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网站发出服务电话。
我的SSO(或STS,如果您愿意)未将WCF服务配置为信赖方。
未正确配置服务配置。特别是在syste.identityModel的audienceUris节点上。它必须与服务端点URL完全匹配。
<system.identityModel>
<identityConfiguration>
<audienceUris>
<add value="https://localhost/IdpExample.YService/YService.svc" />
</audienceUris>
....
</identityConfiguration>
</system.identityModel>