Функция SQL CLR не может олицетворять, когда SQL Server работает как учетная запись домена вместо SYSTEM или NETWORK SERVICE - PullRequest
0 голосов
/ 11 июня 2011

У меня есть следующий код, отлично работающий на тестовом окне, которое запускает службу MSSQLSERVER в качестве SYSTEM:

      currentIdentity = SqlContext.WindowsIdentity;
      impersonatedIdentity = currentIdentity.Impersonate();

       client.PreAuthenticate = true;
       client.Credentials = CredentialCache.DefaultNetworkCredentials;
       client.Url = currentURL;

   /* Encrypt */
   try
   {
      encryptedText = client.Encrypt(plainText);
   }
   finally
    {
        if (impersonatedIdentity != null)
        {
            impersonatedIdentity.Undo();
        }
    }

        return encryptedText;

Основная идея этой функции - шифрование / дешифрование текста через веб-сервис, размещенный внутри,Всякий раз, когда эта функция вызывается на сервере, на котором запущена служба MSSQLSERVER с именем «SYSTEM» или другой локальной учетной записью, олицетворение работает нормально.Если на сервере запущена служба MSSQLSERVER в качестве учетной записи домена (то есть DOMAIN \ sqlaccount), учетные данные DOMAIN \ sqlaccount всегда передаются веб-службе, и олицетворение, похоже, не работает.

Это ожидаемое поведение?Заранее спасибо.

Ответы [ 3 ]

2 голосов
/ 12 июня 2011

Для учетной записи службы, под которой вы запускаете SQL-сервер, включена ли в этой учетной записи олицетворение? В окне свойств для пользователя в активном каталоге есть вкладка, которая называется делегированием. У вас будет выбор: не разрешать делегирование, разрешать делегирование без разбора или настраивать, каким службам разрешено делегировать эту учетную запись. По умолчанию используется «нет доверия», что может быть вашей проблемой. Посмотрите и посмотрите, что вы найдете.

1 голос
/ 11 июня 2011

Переместите вызов функции шифрования из SQLCLR.Выполнение вызовов веб-служб из SQL - очень и очень плохая идея.Ресурсы SQL Server слишком ценны, чтобы тратить их на ожидание ответа HTTP, даже внутреннего.Я никогда не сталкивался с разумным объяснением того, почему следует вызывать веб-сервис изнутри SQLCLR, кроме недальновидного фактора крутости.Вызовите веб-сервис из приложения, это подходящее место для ожидания ответов HTTP.

0 голосов
/ 11 июня 2011

Какой протокол вы используете для аутентификации?

Если вы используете Kerberos, я бы ожидал такого поведения.В Kerberos имена SPN SYSTEM и NETWORK SERVER определяются автоматически.Однако, если вы хотите использовать имя пользовательской службы, вам нужно определить имя участника-службы (для этого имени службы) для проверки подлинности.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...