Возникли проблемы при олицетворении вызова WCF для базы данных, отображается ошибка входа в систему для домена \ компьютера $ - PullRequest
3 голосов
/ 18 ноября 2011

У меня есть служба WCF, которая размещена в службе Windows.Служба Windows установлена ​​и работает под учетной записью локальной системы.

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

БД и служба Windows живут на одной машине.Мы используем проверку подлинности Windows.

Файл app.config службы Windows:

<service name="ShoppingService" behaviorConfiguration="DefaultBehavior">
  <host>
    <baseAddresses>
      <add baseAddress="http://localhost:9900/ShoppingService"/>
    </baseAddresses>
  </host>
  <endpoint address="" binding="wsHttpBinding" 
            contract="solution.IShoppingService">
    <identity>
      <dns value="localhost"/>
    </identity>
  </endpoint>
  <endpoint address="ShoppingServicemex" binding="basicHttpBinding" 
            contract="IMetadataExchange" />
</service>

Поведение:

<behavior name="DefaultBehavior">
  <serviceMetadata httpGetEnabled="true"/>
  <serviceDebug includeExceptionDetailInFaults="true"/>
  <serviceAuthorization impersonateCallerForAllOperations="true"/>
</behavior>

Реализация WCF:

[OperationBehavior(Impersonation = ImpersonationOption.Allowed)]
public List<Job> GetItems()
{
    using (ServiceSecurityContext.Current.WindowsIdentity.Impersonate())
    {
       string name = System.Threading.Thread.CurrentPrincipal.Identity.Name;
       return ItemDao.GetItems();
    }
}

Клиент подключается к услуге и отправляет запрос.Когда я отлаживаю службу Windows WCF, значение ServiceSecurityContext.Current.WindowsIdentity ** является вызывающей стороной службы.Это нормально.

Затем я выдаю себя за ServiceSecurityContext.Current.WindowsIdentity.Impersonate().

Проблема в том, что когда я вызываю DAO ItemDao.GetItems();, который обращается к БД со следующим соединением: Server=MyServer;Trusted_Connection=yes;Database=My_dev_db;

Я получаю сообщение об ошибке:

System.ServiceModel.FaultException`1 was unhandled by user code
  Message=Could not get ADO.NET connection.
  Source=mscorlib
Login failed for user: domain\machinename$

Кажется, что он вызывает БД с учетной записью пользователя LocalSystem.Я хочу выдавать себя за абонента каждый раз, поэтому проверяю, достаточно ли у него разрешений безопасности для вызова DAO.

Я создаю клиента с использованием фабрики каналов функции WCF spring.net.

Чтоя скучаю?Пожалуйста, руководство?

1 Ответ

2 голосов
/ 19 ноября 2011

Мне может понадобиться Kerberos, чтобы сделать это, это звучит как классическая " Double Hop Problem ."

...