Поделиться через


Олицетворение и учетные данные для соединений

В условиях интеграции SQL Server со средой CLR использовать проверку подлинности Windows сложнее, чем проверку подлинности SQL Server, но более безопасно. При использовании проверки подлинности Windows имейте ввиду следующие замечания.

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

В некоторых случаях бывает необходимо олицетворить вызывающего при помощи свойства SqlContext.WindowsIdentity, а не запускать его, как учетную запись службы. Экземпляр WindowsIdentity представляет идентификатор клиента, запустившего вызывающий код, и его можно использовать только если клиент использовал проверку подлинности Windows. Получив экземпляр WindowsIdentity, можно вызвать метод Impersonate, чтобы изменить маркер безопасности потока, а затем открыть соединения ADO.NET от имени клиента.

После вызова метода SQLContext.WindowsIdentity.Impersonate возможность получения доступа к локальным и системным данным исключается. Чтобы снова получить доступ к данным, необходимо вызвать метод WindowsImpersonationContext.Undo.

В следующем примере показано, как олицетворить вызывающий объект при помощи свойства SqlContext.WindowsIdentity.

Visual C#

WindowsIdentity clientId = null;
WindowsImpersonationContext impersonatedUser = null;

clientId = SqlContext.WindowsIdentity;

// This outer try block is used to protect from 
// exception filter attacks which would prevent
// the inner finally block from executing and 
// resetting the impersonation.
try
{
   try
   {
      impersonatedUser = clientId.Impersonate();
      if (impersonatedUser != null)
         return GetFileDetails(directoryPath);
         else return null;
   }
   finally
   {
      if (impersonatedUser != null)
         impersonatedUser.Undo();
   }
}
catch
{
   throw;
}
ПримечаниеПримечание

Дополнительные сведения об изменениях поведения при олицетворении см. в разделе Критические изменения в функциях компонента Database Engine в SQL Server 2008 R2.

Более того, если был получен экземпляр идентификатора Microsoft Windows, то по умолчанию нельзя перенести этот экземпляр на другой компьютер; по умолчанию инфраструктура безопасности Windows не позволяет делать этого. Однако существует механизм под названием «делегирование», который позволяет распространять идентификаторы Windows на несколько доверенных компьютеров. Дополнительные сведения о делегировании можно узнать в статье TechNet «Переход протокола Kerberos и ограниченное делегирование».

См. также

Основные понятия