Проблема аутентификации с междоменной службой WCF - PullRequest
1 голос
/ 01 августа 2011

Я новичок в WCF и его безопасности, поэтому искал помощь по проблеме, с которой я столкнулся.

У меня есть служба WCF, которую нужно развернуть на каждой машине в небольшом домене. Служба WCF должна размещаться в службе Windows, поскольку в ней есть методы, которые необходимо вызывать с повышенными правами. На данный момент сервис очень черновой (он предоставляет метаданные - но я считаю, что это должно быть отключено позже - возможно ли это?). Он использует привязку net.tcp - App.Config службы показан ниже:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <system.serviceModel>
    <services>
      <service behaviorConfiguration="SvcBehavior" name="Microsoft.ServiceModel.Samples.Svc">
        <endpoint address="" binding="netTcpBinding"
          contract="Microsoft.ServiceModel.Samples.ISvc" />
        <endpoint address="mex" binding="mexTcpBinding" bindingConfiguration=""
          contract="IMetadataExchange" />
        <host>
          <baseAddresses>
            <add baseAddress="net.tcp://*:8100/ServiceModelSamples/service" />
          </baseAddresses>
          <timeouts closeTimeout="00:10:00" openTimeout="00:10:00" />
        </host>
      </service>
    </services>
    <behaviors>
      <serviceBehaviors>
        <behavior name="SvcBehavior">
          <serviceMetadata httpGetEnabled="false" />
          <serviceDebug includeExceptionDetailInFaults="true" />
        </behavior>
      </serviceBehaviors>
    </behaviors>
  </system.serviceModel>
</configuration>

Для клиента у меня есть приложение Winforms C #. Приложение выполняет 2 функции, оно извлекает статическую информацию из службы, а затем дает пользователю возможность аутентифицироваться и вызывать административные методы. Поэтому аутентификация выполняется на уровне клиента.

Я использую Channelfactory для подключения к сервису, так как имя хоста является переменным (у пользователя запрашивается его при запуске клиента), а файл app.config для клиента показан ниже - он практически пуст:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <system.serviceModel>
    <bindings>
     </bindings>
    <client />
  </system.serviceModel>
</configuration>

Код канала:

[System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
[System.ServiceModel.ServiceContractAttribute(Namespace = "http://Microsoft.ServiceModel.Samples", ConfigurationName = "ISvc")]


ChannelFactory<ISvc> myChannelFactory = new ChannelFactory<ISvc>(new NetTcpBinding(), "net.tcp://" + HostName + ":8100/ServiceModelSamples/service");
        public static ISvc client = null;

У меня есть интерфейс, который описывает методы службы.

Основная проблема, с которой я столкнулся, заключается в следующем. Скажем, есть Machine1 и Machine2 , работающие на domainA . Предположим, что Machine1 обслуживает службу, а Machine2 запускает клиент.

Когда я подключаюсь к службе, используя учетную запись домена domainA \ User , служба работает нормально, но говорят, что у меня есть локальный пользователь на Machine2 и я хочу подключиться к службе как Machine2 \ LocalUser , я получаю следующее сообщение об ошибке:

Сервер отклонил учетные данные клиента.

Я попытался поэкспериментировать с установкой режима безопасности на ноль (не то, что я хотел бы сделать), но затем я получаю сообщение о том, что клиент и служба имеют несоответствие конфигурации.

Что я могу сделать, чтобы это исправить? Кроме того, что произойдет, если служба, работающая в domainA \ Machine1 , была вызвана пользователем из другого домена - скажем, domainB \ User2 ?

Заранее спасибо - я хотел бы получить представление об этом!

1050 * Chada *

1 Ответ

2 голосов
/ 01 августа 2011

Если вы отключите безопасность на сервисе, вы должны также отключить клиент.Если вы настраиваете клиента в коде, вы должны установить ту же конфигурацию для нового экземпляра NetTcpBinding, что и для службы в файле конфигурации.

Когда используется защита Windows (по умолчанию для NetTcpBinding), MachineB не может аутентифицироватьсялокальные учетные записи от MachineA (были некоторые хитрости с дублирующимися локальными пользователями, но я не знаю, работают ли они также с WCF).Вот почему у вас есть домен.Для междоменной аутентификации Windows требуется доверие между доменами.

Если вам требуется аутентифицировать междоменных пользователей или локальных пользователей, вы не можете использовать аутентификацию Windows.Существуют другие механизмы аутентификации, но они требуют настройки сертификата (по крайней мере, для службы) и используют либо сертификат клиента, либо имя пользователя и пароль для аутентификации клиента.

...