wcf NetworkCredential с пустым именем пользователя и паролем

Я создал службу WCF, и режим безопасности был установлен на Transport, а ClientCredentialType — на Windows. Ниже мой клиентский код:

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, но во время теста я обнаружил, что могу установить UserName и Password как empty, и канал все еще может быть создан. Почему?
Клиент и сервер находятся не на одном компьютере, а в одном домене. Учетная запись для входа на клиентском компьютере может войти в систему на серверном компьютере. В этом случае я мог бы использовать пустое имя пользователя и пароль для создания соединения и вызова службы WCF.


person Kerwen    schedule 17.12.2020    source источник


Ответы (1)


Фабрика каналов, созданная клиентом, не имеет ничего общего с сервером WCF. Даже если сервер закроет клиента, фабрика каналов может быть успешно создана, но при вызове метода произойдет ошибка.

Если вы создаете только канал, то вы устанавливаете имя пользователя и пароль в учетных данных, которые не имеют ничего общего со службой WCF. Только при совершении вызова клиент передаст серверу имя пользователя и пароль, и значение имени пользователя и пароля будет проверено.

Это объяснение в документации Microsoft:

введите здесь описание изображения

ОБНОВЛЕНИЕ:

Есть еще одна возможность, которая может вызвать эту проблему. Если клиент и сервер находятся на одном компьютере, клиенту не нужно предоставлять учетные данные Windows.

person Ding Peng    schedule 18.12.2020
comment
Плохо, я не загрузил весь свой код. Я создал канал и использовал этот канал для вызова интерфейса сервера. Интерфейс может быть успешно вызван, если я установил имя пользователя и пароль как string.Empty - person Kerwen; 18.12.2020
comment
Что такое конфигурационный файл сервера? - person Ding Peng; 18.12.2020
comment
Я обновляю свой ответ. - person Ding Peng; 18.12.2020
comment
Клиент и сервер находятся не на одной машине, а в одном домене. Учетная запись для входа на клиентском компьютере может войти в систему на серверном компьютере. В этом случае я мог бы использовать пустое имя пользователя и пароль для создания соединения и вызова службы WCF. Мне любопытно, почему это могло работать и механизм, стоящий за этим. - person Kerwen; 21.12.2020
comment
Я думаю, что это также может быть связано с тем, что аутентификация Windows не была успешно применена. Вы можете попробовать включить аутентификацию Windows в IIS и отключить анонимную аутентификацию. - person Ding Peng; 19.01.2021