WCF客户端无法与在其他计算机上运行的服务协商安全访问

时间:2009-03-26 09:40:14

标签: wcf

我正在尝试使用绑定“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天谷歌中提供的所有解决方案,但没有运气。请紧急帮忙。

3 个答案:

答案 0 :(得分:1)

如果我理解你的问题,听起来你的代表团有问题。

以下是我认为你要做的事情:

  • 用户连接到网络服务
  • 用户通过Windows身份验证(kerberos)进行身份验证
  • 网络服务器冒充用户
  • Webserver通过WCF
  • 连接到后端
  • Web服务器使用用户凭据(kerberos)
  • 对后端进行身份验证
  • 后端接受凭据并提供数据

需要发生的事情是您的后端必须信任您的网络服务器代表您行事,称为委托。这是由域控制而不是自由给出。

如果两台计算机位于同一个域中,则域控制器必须将Web服务器配置为能够委派给用户。如果没有这个,网络上的任何机器都不会信任代表用户行事的Web服务器。如果这一切都发生在同一台机器上,那么它就是自己的代表团。

如果两台机器都在工作组中,我不知道你会做什么。

答案 1 :(得分:0)

我认为您需要在服务器的web.config中指定“none”的安全性。否则它将默认坚持认证机制。

答案 2 :(得分:0)

试试这个:

<identity>
    <servicePrincipalName value=""/>
</identity>