Compartir vía


Suplantación y credenciales para las 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 de proxy, de modo que sus conexiones salientes tengan un contexto de seguridad diferente al de la cuenta de servicio de Windows.

En algunos casos, es posible que desee 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 de C# siguiente se muestra cómo suplantar al autor de la llamada mediante la propiedad SqlContext.WindowsIdentity.

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 del motor de base de datos de SQL Server 2016.

Además, si obtuvo la instancia de identidad de 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 permite la propagación de identidades de Windows en varios equipos de confianza. Para obtener más información sobre la delegación, vea transición del protocolo Kerberos y delegación restringida.