Вопрос о подключении и имперсонации БД службы Windows WCF - PullRequest
1 голос
/ 12 августа 2011

У меня есть вопрос, касающийся подражания в WCF.Я хотел бы подключиться к БД в службе WCF Windows, которая вызывается клиентским приложением.Подключение к БД должно осуществляться с использованием учетной записи, под которой работает служба.НО я хотел бы проверить, что вызов службы WCF сделан из надежного источника (проверить, что пользователь клиентского приложения является аутентифицированным пользователем домена).

Какую защиту вы бы мне посоветовали использовать?

Я пробовал олицетворение, но получаю эту ошибку при попытке подключиться к БД из службы Windows:

System.Data.SqlClient.SqlException: сбой входа для пользователя 'NT AUTHORITY \ ANONYMOUS LOGON'.

Строка конфигурации выглядит следующим образом:

сервер= myServer; Исходный каталог = myDatabase; Интегрированная безопасность = True

Конфигурация службы WCF выглядит следующим образом:

<system.serviceModel>
<services>
  <service name="MyNamespace.MyService"
           behaviorConfiguration="TransfertServiceBehavior">
    <host>
      <baseAddresses>
        <add baseAddress="net.tcp://localhost:8095/MyNamespace.MyService"/>
      </baseAddresses>
    </host>
    <endpoint address=""
              binding="netTcpBinding"
              bindingConfiguration="TransactionalBinding"
              contract="myContract" />
    <endpoint address="mex"
              binding="mexTcpBinding"
              contract="IMetadataExchange" />
  </service>
</services>

<bindings>
  <netTcpBinding>
    <binding name="TransactionalBinding"
             transferMode="Streamed" transactionFlow="true" maxReceivedMessageSize="1000000000">
      <readerQuotas maxDepth="10000" maxStringContentLength="1000000000"
              maxArrayLength="1000000000" maxBytesPerRead="10000" maxNameTableCharCount="10000" />
      <security mode="Transport" />
    </binding>

  </netTcpBinding>
</bindings>

<behaviors>
  <serviceBehaviors>
    <behavior name="TransfertServiceBehavior">
      <serviceMetadata httpGetEnabled="False"/>
      <serviceDebug includeExceptionDetailInFaults="false"/>
      <serviceAuthorization impersonateCallerForAllOperations="true" />
    </behavior>
  </serviceBehaviors>
</behaviors>

Конфигурация наклиентское приложение выглядит так:

<system.serviceModel>
<bindings>
  <netTcpBinding>
    <binding name="NetTcpBinding_Client" closeTimeout="00:01:00"
      openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00"
      transactionFlow="true" transferMode="Streamed" transactionProtocol="OleTransactions"
      hostNameComparisonMode="StrongWildcard" listenBacklog="10" maxBufferPoolSize="1000000000"
      maxBufferSize="1000000000" maxConnections="10" maxReceivedMessageSize="65536">
      <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="1000000000"
        maxBytesPerRead="4096" maxNameTableCharCount="16384" />
      <reliableSession ordered="true" inactivityTimeout="00:10:00"
        enabled="false" />
      <security mode="Transport">
        <transport clientCredentialType="Windows" protectionLevel="EncryptAndSign" />
        <message clientCredentialType="Windows" />
      </security>
    </binding>
  </netTcpBinding>
</bindings>
<client>

  <endpoint address="net.tcp://localhost:8095/MyNamespace.MyService"
    binding="netTcpBinding" bindingConfiguration="NetTcpBinding_Client"
    contract="myContract" behaviorConfiguration="ImpersonationBehavior">
    <identity>
      <userPrincipalName value="myUsername@intra.myDomain.ca" />
    </identity>
  </endpoint>
</client>

<behaviors>
  <endpointBehaviors>
    <behavior name="ImpersonationBehavior">
      <clientCredentials>
        <windows allowedImpersonationLevel="Impersonation" />
      </clientCredentials>
    </behavior>
  </endpointBehaviors>
</behaviors>

Ответы [ 2 ]

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

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

Подробные инструкции на Настройка удостоверения службы WCF, доверенного для ограниченного делегирования :

  • На контроллере домена запустите консоль управления Microsoft (MMC) Оснастка «Active Directory - пользователи и компьютеры».
  • На левой панели оснастки MMC щелкните узел Компьютеры.
  • На правой панели дважды щелкните по вашему компьютеру сервера WCF, чтобы откройте диалоговое окно «Свойства».
  • На вкладке «Делегирование» окна «Свойства» для сервера WCF. компьютер, не доверяйте компьютеру для делегирования, выбранному дефолт. Чтобы использовать ограниченное делегирование, выберите Доверять этому компьютеру для делегирование только указанным услугам. Вы указываете, какие именно доступ к услуге или сервисам можно получить в нижней панели.
  • Beneath Доверяйте этому компьютеру для делегирования указанным сервисам только, оставьте параметр по умолчанию Использовать только Kerberos выбранным.
  • Нажмите кнопку «Добавить», чтобы открыть диалоговое окно «Добавить службы».
  • Нажмите кнопку Пользователи или компьютеры.
  • В диалоговом окне Выбор пользователей или компьютеров введите имя вашего компьютер сервера базы данных, если вы используете SQL Server в качестве системы или Сетевой сервис.

    В качестве альтернативы, если вы используете SQL Server с помощью пользовательского учетная запись домена, введите вместо этого имя учетной записи и нажмите кнопку ОК. Вы увидите все имена участников-служб, настроенные для выбранного пользователя или учетная запись компьютера. Чтобы ограничить доступ к SQL Server, выберите MSSQLSvc, а затем нажмите кнопку ОК.

1 голос
/ 12 августа 2011

Удалите эту строку из конфигурации вашего сервиса:

<serviceAuthorization impersonateCallerForAllOperations="true" />

и это из конфигурации вашего клиента:

<behaviors>
  <endpointBehaviors>
    <behavior name="ImpersonationBehavior">
      <clientCredentials>
        <windows allowedImpersonationLevel="Impersonation" />
      </clientCredentials>
    </behavior>
  </endpointBehaviors>
</behaviors>

Олицетворение означает, что все операции будут выполняться в контексте олицетворенных пользователей = идентификатор службы заменяется идентификатором вызывающего пользователя. Если ваш SQL-сервер установлен локально на компьютере, на котором работает служба Windows, ваши обращения к базе данных также будут олицетворены.

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

...