netTcpBinding без учетных данных Windows? - PullRequest
9 голосов
/ 03 августа 2009

У меня есть приложение для управления машиной, где у меня есть один клиентский компьютер и пять серверных блоков, взаимодействующих в подсети машины. Контроллера домена нет. Я хотел бы использовать netTcpBinding для обеспечения надежности и поддержки транзакций.

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

Ответы [ 2 ]

11 голосов
/ 03 августа 2009

Да, конечно - но только если вы используете безопасность сообщений (а не безопасность транспорта). Определите свою конфигурацию привязки следующим образом:

  <netTcpBinding>
    <binding name="UserNameSecurity">
      <security mode="Message">
        <message clientCredentialType="UserName"/>
      </security>
    </binding>
  </netTcpBinding>

и затем ссылка на эту конфигурацию привязки в ваших конечных точках (на сервере и клиенте):

 <endpoint address="....."
           binding="netTcpBinding"
           bindingConfiguration="UserNameSecurity"
           contract="IMyService" />

Марк

UPDATE:
Ах, да, на стороне сервера вам понадобится сертификат для аутентификации сервиса для клиента, который его вызывает, и он также используется для шифрования + подписи сообщений. Это только на сервере - клиентам не нужно ничего устанавливать.

Конфигурация:

<behaviors>
  <serviceBehavior>
    <behavior name="ServerInternet">
      <serviceCredentials>
        <serviceCertificate
           findValue="MyServiceCertificate"
           storeLocation="LocalMachine"
           storeName="My"
           x509FindType="FindBySubjectName" />
      </serviceCredentials>
    </behavior>
  </serviceBehavior>
</behaviors>
<services>
  <service name="MyServiceInternet"
           behaviorConfiguration="ServerInternet">
     ....
  </service>
</services>

Убедитесь, что сертификат вашего сервера установлен в папку «Local Machine» на вашем сервере под «именем субъекта», которое вы указываете в своей конфигурации.

0 голосов
/ 03 августа 2009

Есть кое-что, что вы можете попробовать в первую очередь. Установите для свойства serviceNegotiationCredentials значение true:

<message negotiateServiceCredential="true"/>

Это создаст безопасный диалог между вашим клиентом и вашим сервисом без контроллера домена.

НО, если нет контроллера домена, клиент не доверяет вашей службе, поэтому он потерпит неудачу.

Таким образом, вы должны установить ожидаемый идентификатор службы . Вы можете найти это в WSDL вашего сервиса. По умолчанию, если вы размещены на IIS, это выглядит так:

<client>
    <endpoint>
        <identity>
            <servicePrincipalName value="host/NETWORKSERVICE"></servicePrincipalName>
        </identity>
    </endpoint>
</client>

Не думаю, что вам это понадобится, но, возможно, вам придется разрешить анонимный вход на стороне службы:

<serviceBehaviors>
    <behavior>
        <serviceCredentials>
            <windowsAuthentication allowAnonymousLogons="true"/>
        </serviceCredentials>
    </behavior>
</serviceBehaviors>
...