Rappresentazione e credenziali per le connessioni
Nell'integrazione con Common Language Runtime (CRL) di SQL Server, l'utilizzo dell'autenticazione di Windows è complesso, ma più sicuro rispetto all'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 tramite la proprietà SqlContext.WindowsIdentity anziché procedere con l'esecuzione come account di servizio. L'istanza di WindowsIdentity rappresenta l'identità del client che ha richiamato il codice chiamante ed è disponibile solo quando il client ha utilizzato l'autenticazione di Windows. Dopo avere ottenuto l'istanza di WindowsIdentity, è possibile chiamare Impersonate per modificare il token di sicurezza del thread e quindi aprire le connessioni ADO.NET per conto del client.
Dopo aver chiamato SQLContext.WindowsIdentity.Impersonate, non è possibile accedere ai dati locali né a quelli di sistema. Per accedere nuovamente ai dati, è necessario chiamare WindowsImpersonationContext.Undo.
Nell'esempio seguente viene illustrata la modalità di rappresentazione del chiamante mediante 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 della rappresentazione, vedere Modifiche che possono causare problemi di funzionamento apportate alle caratteristiche del Motore di database in SQL Server 2008 R2.
Inoltre, se è stata ottenuta l'istanza dell'identità di Microsoft Windows, per impostazione predefinita non è possibile propagarla in un altro computer, in quanto la propagazione è limitata dall'infrastruttura di sicurezza di Windows. Esiste tuttavia un meccanismo noto come "delega" che abilita la propagazione delle identità di Windows in più computer attendibili. Ulteriori informazioni sulla delega sono disponibili nell'articolo TechNet "Kerberos Protocol Transition and Constrained Delegation".