Condividi tramite


Rappresentazione e credenziali per le connessioni

Si applica a: SQL Server

Nell'integrazione di SQL Server Common Language Runtime (CLR) l'uso dell'autenticazione di Windows è complesso, ma è più sicuro rispetto all'uso dell'autenticazione di SQL Server. Utilizzando l'autenticazione di Windows, è necessario tenere conto di alcune considerazioni.

Per impostazione predefinita, un processo di SQL Server che si connette a Windows acquisisce il contesto di sicurezza dell'account di servizio Windows di SQL Server. È tuttavia possibile eseguire il mapping di una funzione CLR a un'identità del proxy, in modo che le connessioni in uscita dispongano di un contesto di sicurezza diverso da quello dell'account di servizio Windows.

In alcuni casi, può essere necessario rappresentare il chiamante usando la proprietà SqlContext.WindowsIdentity anziché come account del servizio. L'istanza di WindowsIdentity rappresenta l'identità del client che ha richiamato il codice chiamante ed è disponibile solo quando il client usa l'autenticazione di Windows. Dopo aver ottenuto l'istanza di WindowsIdentity , è possibile chiamare Impersonate per modificare il token di sicurezza del thread e quindi aprire ADO.NET connessioni per conto del client.

Dopo aver chiamato SQLContext.WindowsIdentity.Impersonate, non è possibile accedere ai dati locali e non è possibile accedere ai dati di sistema. Per accedere di nuovo ai dati, è necessario chiamare WindowsImpersonationContext.Undo.

Nell'esempio seguente viene illustrato come rappresentare il chiamante usando la proprietà 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

Per informazioni sulle modifiche del comportamento nella rappresentazione, vedere Modifiche di rilievo alle funzionalità di motore di database in SQL Server 2016.

Inoltre, se hai ottenuto l'istanza dell'identità di Microsoft Windows, per impostazione predefinita non puoi propagare tale istanza a un altro computer; L'infrastruttura di sicurezza di Windows limita questa impostazione per impostazione predefinita. Esiste tuttavia un meccanismo noto come "delega" che abilita la propagazione delle identità di Windows in più computer attendibili. Per altre informazioni sulla delega, vedere l'articolo TechNet relativo alla transizione del protocollo Kerberos e alla delega vincolata.

Vedi anche

Oggetto SqlContext