Compartir por


Suplantación y credenciales para conexiones

Se aplica a: SQL Server

En la integración de Common Language Runtime (CLR) de SQL Server, el uso de la autenticación de Windows es complejo, pero es más seguro que usar la autenticación de SQL Server. Al usar la autenticación de Windows, tenga presente las consideraciones siguientes.

De forma predeterminada, un proceso de SQL Server que se conecta a Windows adquiere el contexto de seguridad de la cuenta de servicio de Windows para SQL Server. Pero es posible asignar una función CLR a una identidad del proxy, para que sus conexiones salientes tengan un contexto de seguridad diferente que el de la cuenta del servicio de Windows.

En algunos casos, es posible que quiera suplantar al autor de la llamada mediante la propiedad SqlContext.WindowsIdentity en lugar de ejecutarse como la cuenta de servicio. La instancia de WindowsIdentity representa la identidad del cliente que invocó el código de llamada y solo está disponible cuando el cliente usó la autenticación de Windows. Después de obtener la instancia de WindowsIdentity , puede llamar a Impersonate para cambiar el token de seguridad del subproceso y, a continuación, abrir ADO.NET conexiones en nombre del cliente.

Después de llamar a SQLContext.WindowsIdentity.Impersonate, no puede acceder a los datos locales y no puede acceder a los datos del sistema. Para acceder a los datos de nuevo, debe llamar a WindowsImpersonationContext.Undo.

En el ejemplo siguiente se muestra cómo suplantar al autor de la llamada mediante la propiedad 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;  
}  

Nota:

Para obtener información sobre los cambios de comportamiento en la suplantación, vea Cambios importantes en las características de Motor de base de datos en SQL Server 2016.

Además, si obtuvo la instancia de identidad de Microsoft Windows, de forma predeterminada no puede propagar esa instancia a otro equipo; La infraestructura de seguridad de Windows restringe esto de forma predeterminada. Sin embargo, hay un mecanismo denominado "delegación" que habilita la propagación de identidades de Windows a través de varios equipos de confianza. Puede obtener más información sobre la delegación en el artículo de TechNet, "Transición del protocolo Kerberos y delegación restringida".

Consulte también

Objeto SqlContext