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à proxy, in modo che le connessioni in uscita abbiano un contesto di sicurezza diverso rispetto all'account del servizio di Windows.
In alcuni casi, potrebbe essere necessario rappresentare il chiamante usando la proprietà SqlContext.WindowsIdentity
anziché eseguire 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 C# seguente viene illustrato come rappresentare il chiamante usando la proprietà 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
Per informazioni sulle modifiche del comportamento nella rappresentazione, vedere Modifiche di rilievo apportate alle funzionalità del motore di database in SQL Server 2016.
Inoltre, se hai ottenuto l'istanza di identità di Windows, per impostazione predefinita non puoi propagare l'istanza a un altro computer; L'infrastruttura di sicurezza di Windows limita questa impostazione per impostazione predefinita. Esiste tuttavia un meccanismo denominato delega che consente la propagazione delle identità di Windows in più computer attendibili. Per altre informazioni sulla delega, vedere transizione del protocollo Kerberos e delega vincolata.