0

Transport我创建了一个 WCF 服务,并且安全模式已设置ClientCredentialTypeWindows. 下面是我的客户端代码:

NetTcpBinding binding = new NetTcpBinding();
binding.Security.Mode = SecurityMode.Transport;
binding.Security.Transport.ClientCredentialType = TcpClientCredentialType.Windows;
binding.Security.Transport.ProtectionLevel = System.Net.Security.ProtectionLevel.EncryptAndSign;

ChannelFactory<IServices> factory factory = new ChannelFactory<IServices>(binding, service);
NetworkCredential credential = factory.Credentials.Windows.ClientCredential;
credential.UserName = string.Empty;
credential.Password = string.Empty;
IServices connect = factory.CreateChannel();
bResult = connect.IsServerOnline();

服务器配置:

<system.serviceModel>
    <bindings>
      <netTcpBinding>
        <binding name="tcpConSecure" />          
          <security mode="Transport">
            <transport clientCredentialType="Windows" protectionLevel="EncryptAndSign" />
          </security>
        </binding>
      </netTcpBinding>
    </bindings>
    <services>
      <service name="TestService.Services">
        <endpoint address="tcp" behaviorConfiguration="EndpointBe" binding="netTcpBinding" bindingConfiguration="tcpConSecure" contract="TestServiceInterface.IServices" />
      </service>
    </services>
</system.serviceModel>

理论上我应该输入正确的windows账号和密码,但是在测试过程中发现可以设置UserNameandPasswordempty,仍然可以创建频道。为什么?
客户端和服务器不在同一台机器上,但它们在同一个域中。客户端机器的登录帐户可以登录服务器机器。在这种情况下,我可以使用空的用户名和密码来创建连接并调用 WCF 服务。

4

1 回答 1

0

客户端创建的通道工厂与 WCF 服务器无关。即使服务端关闭客户端,也可以成功创建通道工厂,但是调用方法时会报错。

如果你只是创建一个通道,那么你在凭据中设置的用户名和密码与 WCF 服务无关。只有在调用时,客户端才会将用户名和密码传递给服务器,并验证用户名和密码的值。

这是微软文档中的解释:

在此处输入图像描述

更新:

还有另一种可能导致此问题。如果客户端和服务器在同一台机器上,则客户端不需要提供 Windows 凭据。

于 2020-12-18T07:16:49.010 回答