呼叫者未通过该服务进行身份验证

时间:2011-02-11 11:54:14

标签: c# wcf

很抱歉转发,但我很难将其他帖子中的内容应用于我的问题。

我有一个自托管的WCF服务,在我的计算机上托管并且客户端在我的计算机上时可以正常运行。

我已经尝试将客户端移动到另一台计算机上,现在我收到“调用者未通过服务验证”错误。

请有人可以告知问题出在哪里。

如果您需要更多信息,请告知我们。

亲切的问候

这是我的机器上的客户端配置工作

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <system.serviceModel>
    <bindings>
      <wsDualHttpBinding>
        <binding name="WSDualHttpBinding_IDataCollector" 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:10:00" />
          <security mode="Message">
            <message clientCredentialType="Windows" negotiateServiceCredential="true"
              algorithmSuite="Default" />
          </security>
        </binding>
      </wsDualHttpBinding>
    </bindings>
    <client>
      <endpoint address="http://192.168.1.74:8080/" binding="wsDualHttpBinding"
        bindingConfiguration="WSDualHttpBinding_IDataCollector" contract="AshService.IDataCollector"
        name="WSDualHttpBinding_IDataCollector">
        <identity>
          <userPrincipalName value="Ash-PC\Ash" />
        </identity>
      </endpoint>
    </client>
  </system.serviceModel>
</configuration>

继承服务器配置

    <?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <system.serviceModel>
    <bindings>
      <wsDualHttpBinding>
        <binding name="WSDualHttpBinding_IDataCollector" 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:10:00" />
          <security mode="Message">
            <message clientCredentialType="Windows" negotiateServiceCredential="true"
                algorithmSuite="Default" />
          </security>
        </binding>
      </wsDualHttpBinding>
    </bindings>
    <services>
      <service name="DataCollector">
        <endpoint address="http://192.168.1.74:8080" binding="wsDualHttpBinding"
          bindingConfiguration="WSDualHttpBinding_IDataCollector" contract="IDataCollector" />
      </service>
    </services>
    <behaviors>
      <serviceBehaviors>
        <behavior>
          <serviceMetadata httpGetEnabled="True"/>
        </behavior>
      </serviceBehaviors>
    </behaviors>
  </system.serviceModel>
</configuration>

3 个答案:

答案 0 :(得分:2)

您的问题是由Windows身份验证引起的。正如Rest Wing所描述的那样,如果您想使用该服务可以访问的AD凭据,您必须提供这些凭据,以便服务对客户端进行身份验证。

如果您无法使用Windows身份验证,而必须对客户端进行身份验证,则需要查看其他身份验证技术。一种方法是用户名/密码,但您需要建立自己的身份验证算法。另一个是证书;服务器和客户端必须安装证书(X509证书可用)才能识别对方。还有其他方法,但如果我没记错的话,只有上述两种方法适用于不在同一域中的机器。

如果您不需要对客户端进行身份验证,请将安全模式设置为“无”。这将是一种通过互联网提供公开服务的技术。

答案 1 :(得分:1)

您在客户端和服务端配置了不同的绑定 尝试在两侧使用相同的绑定配置,并查看异常是否消失。

修改: 还必须提供用于服务端客户端身份验证的凭据。

// Provide client credentials
NetworkCredential credentials = new NetworkCredential( "UserName", "RealPasswordHere", "DomainOrMachineName" );

// Create factory that will be used to create proxy to the service
// Pass the client credentials into the factory
var factory = new ChannelFactory<AshService.IDataCollector>( "WSDualHttpBinding_IDataCollector" );
factory.Credentials.Windows.ClientCredential = credentials;

// Create and open proxy to the service
AshService.IDataCollector proxy = factory.CreateChannel();
( proxy as IChannel ).Open();

// Invoke an operation from the service

答案 2 :(得分:1)

试试这个

svc.ClientCredentials.Windows.ClientCredential.UserName = "username";
svc.ClientCredentials.Windows.ClientCredential.Password = "password";