我在共享环境中托管了一个WCF服务(我们从一个网络托管公司租用空间,但我们有一个专用的应用程序池。),我有一个调用wcf服务的asp.net Web应用程序。这两个项目都是.NET 4项目。
如果我从VS2010运行我的Web应用程序,我可以轻松地进行wcf调用。但是,如果我在该共享环境中发布网站并从那里发出wcf调用,我会遇到例外情况。
异常详情:
[FaultException:无法满足安全令牌的请求,因为身份验证失败。 System.ServiceModel.Security.SecurityUtils.ThrowIfNegotiationFault(消息消息,EndpointAddress目标)+5499790 System.ServiceModel.Security.SspiNegotiationTokenProvider.GetNextOutgoingMessageBody(Message incomingMessage,SspiNegotiationTokenProviderState sspiState)+49
[SecurityNegotiationException:调用者未通过该服务进行身份验证。] System.Runtime.Remoting.Proxies.RealProxy.HandleReturnMessage(IMessage reqMsg,IMessage retMsg)+9464367 System.Runtime.Remoting.Proxies.RealProxy.PrivateInvoke(MessageData& msgData,Int32 type)+345
我也在本地机器上发布网站,它也有效。
这是我在服务器端的配置:
<wsHttpBinding>
<binding name="wsHttpBinding" closeTimeout="00:01:00"
openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00"
transactionFlow="false"
hostNameComparisonMode="StrongWildcard"
maxBufferPoolSize="2147483647"
maxReceivedMessageSize="2147483647">
<readerQuotas maxDepth="2147483647"
maxStringContentLength="2147483647"
maxArrayLength="2147483647"
maxBytesPerRead="2147483647"
maxNameTableCharCount="2147483647" />
</binding>
</wsHttpBinding>
客户端代码:
factory.Credentials.Windows.Username = "user";
factory.Credentials.Windows.Password = "psw";
factory = new ChannelFactory<IService>(binding, serviceAddress);
factory.Open();
service = factory.CreateChannel();
我想使用wsHttpBinding而不是basicHttpBinding,我确实需要一些安全性,所以我不想将安全模式设置为None。
Windows 2008 R2上的IIS版本为7,并且设置为允许匿名身份验证。 Asp.net模拟被禁用。
我不认为这些设置中存在错误,因为如果我从VS2010运行网站项目,它确实有效。
感谢您的帮助。
小苏
答案 0 :(得分:3)
仅当客户端和服务器(表示网站和服务)位于同一Windows域或同一台计算机上时,才支持Windows客户端凭据。 SSPI协商或Kerberos协商在不受信任的计算机/域之间不起作用。