我正在尝试使用绑定“wsDualHttpBinding”来托管WCF服务。当我从同一台机器运行我的客户端和服务(在IIS中托管)时,它工作正常。但是,当我在不同的机器上托管服务时,我的客户端无法注册该服务。以下错误即将来临......
[System.ServiceModel.Security.SecurityNegotiationEception] 呼叫者未经过身份验证 服务。内心异常: 请求安全令牌不能 因为认证而感到满意 失败。
尝试从另一个工作组中的其他计算机运行时,会出现以下错误
“客户无法完成 内部安全谈判 配置时间(00:00:00)“
在IIS6.0中,我关闭了集成身份验证并允许匿名访问。
我的服务的Web.Config如下:
<system.serviceModel>
<diagnostics>
<messageLogging logMalformedMessages="true" logMessagesAtServiceLevel="true" logMessagesAtTransportLevel="true"/>
</diagnostics>
<bindings>
<wsDualHttpBinding>
<binding name="StatTickerHttpBinding" bypassProxyOnLocal="false" useDefaultWebProxy="true" receiveTimeout="23:59:59">
<reliableSession ordered="true" inactivityTimeout="00:30:00"/>
</binding>
</wsDualHttpBinding>
</bindings>
<services>
<service name="StatTickerService" behaviorConfiguration="ServiceBehavior">
<!-- Service Endpoints -->
<endpoint address="" binding="wsDualHttpBinding" bindingConfiguration="StatTickerHttpBinding" contract="IBroadCastService">
<!--
Upon deployment, the following identity element should be removed or replaced to reflect the
identity under which the deployed service runs. If removed, WCF will infer an appropriate identity
automatically.
<identity>
<dns value="localhost"/>
</identity> -->
</endpoint>
<endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>
</service>
</services>
<behaviors>
<serviceBehaviors>
<behavior name="ServiceBehavior">
<!-- To avoid disclosing metadata information, set the value below to false and remove the metadata endpoint above before deployment -->
<serviceMetadata httpGetEnabled="true"/>
<!-- To receive exception details in faults for debugging purposes, set the value below to true. Set to false before deployment to avoid disclosing exception information -->
<serviceDebug includeExceptionDetailInFaults="false"/>
</behavior>
</serviceBehaviors>
</behaviors>
</system.serviceModel>
我的客户端App.Config遵循......
<system.serviceModel>
<bindings>
<wsDualHttpBinding>
<binding name="WSDualHttpBinding_StatTickerBroadcastService"
closeTimeout="00:01:00" openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00"
bypassProxyOnLocal="false" transactionFlow="false" hostNameComparisonMode="StrongWildcard"
maxBufferPoolSize="524288" maxReceivedMessageSize="65536"
messageEncoding="Text" textEncoding="utf-8" useDefaultWebProxy="true">
<readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"
maxBytesPerRead="4096" maxNameTableCharCount="16384"/>
<reliableSession ordered="true" inactivityTimeout="00:30:00"/>
<security mode="Message">
<message clientCredentialType="Windows" negotiateServiceCredential="true" algorithmSuite="Default"/>
</security>
</binding>
</wsDualHttpBinding>
</bindings>
<client>
<endpoint address="http://192.168.100.77/TPS.StatTicker.WCFservice/Service.svc" binding="wsDualHttpBinding"
bindingConfiguration="WSDualHttpBinding_StatTickerBroadcastService"
contract="BroadcastGateway.StatTickerBroadcastService"
name="WSDualHttpBinding_StatTickerBroadcastService">
<identity>
<servicePrincipalName value="host/192.168.100.77"/>
</identity>
</endpoint>
</client>
</system.serviceModel>
客户端配置使用svcutil完成。
我搜索并尝试了过去4天谷歌中提供的所有解决方案,但没有运气。请紧急帮忙。
答案 0 :(得分:1)
如果我理解你的问题,听起来你的代表团有问题。
以下是我认为你要做的事情:
需要发生的事情是您的后端必须信任您的网络服务器代表您行事,称为委托。这是由域控制而不是自由给出。
如果两台计算机位于同一个域中,则域控制器必须将Web服务器配置为能够委派给用户。如果没有这个,网络上的任何机器都不会信任代表用户行事的Web服务器。如果这一切都发生在同一台机器上,那么它就是自己的代表团。
如果两台机器都在工作组中,我不知道你会做什么。
答案 1 :(得分:0)
我认为您需要在服务器的web.config中指定“none”的安全性。否则它将默认坚持认证机制。
答案 2 :(得分:0)
试试这个:
<identity>
<servicePrincipalName value=""/>
</identity>