Condividi tramite


Rappresentazione e protezione per l'integrazione con CLR

Quando il codice gestito accede alle risorse esterne, SQL Server non rappresenta automaticamente il contesto di esecuzione corrente nel quale viene eseguita la routine. Il contesto di esecuzione corrente può essere rappresentato in modo esplicito dal codice degli assembly EXTERNAL_ACCESS e UNSAFE.

[!NOTA]

In SQL Server 2008 sono presenti delle modifiche del comportamento della rappresentazione. Per ulteriori informazioni, vedere Modifiche che possono causare problemi di funzionamento apportate alle funzionalità del Motore di database in SQL Server 2008..

Il provider di accesso ai dati in-process fornisce un'API, SqlContext.WindowsIdentity, che può essere utilizzata per recuperare il token associato al contesto di protezione corrente. Il codice gestito degli assembly EXTERNAL_ACCESS e UNSAFE può utilizzare questo metodo per recuperare il contesto e servirsi del metodo .NET Framework WindowsIdentity.Impersonate per rappresentarlo. Di seguito sono indicate le restrizioni che si applicano quando il codice utente esegue una rappresentazione in modo esplicito:

  • L'accesso ai dati in-process non è consentito quando il codice gestito si trova in uno stato rappresentato. Il codice può annullare la rappresentazione, quindi chiamare l'accesso ai dati in-process. Si noti che questa operazione richiede l'archiviazione del valore restituito (un oggetto WindowsImpersonationContext) del metodo Impersonate originale e la chiamata al metodo Undo su questo oggetto WindowsImpersonationContext.

    Come conseguenza di questa restrizione, durante l'accesso ai dati in-process, questo si verifica sempre nel contesto di protezione corrente attivo per la sessione e non può essere modificato dalla rappresentazione esplicita all'interno del codice gestito.

  • Per il codice gestito che viene eseguito in modo asincrono (ad esempio tramite gli assembly UNSAFE che creano thread ed eseguono il codice in modo asincrono), l'accesso ai dati in-process non è mai consentito. Ciò accade indipendentemente dalla rappresentazione.

Quando il codice è in esecuzione in un contesto rappresentato diverso da SQL Server, non può eseguire le chiamate di accesso ai dati in-process. Prima di effettuare chiamate di accesso ai dati in-process, è necessario annullare il contesto di rappresentazione. Quando l'accesso ai dati in-process viene effettuato da codice gestito, per l'autorizzazione viene utilizzato sempre il contesto di esecuzione originale del punto di ingresso Transact-SQL nel codice gestito.

Gli assembly EXTERNAL_ACCESS e UNSAFE accedono alle risorse del sistema operativo con l'account del servizio SQL Server, a meno che non rappresentino volontariamente il contesto di protezione corrente come descritto in precedenza. Per questo motivo, gli autori degli assembly EXTERNAL_ACCESS richiedono un livello di attendibilità superiore rispetto a quello degli assembly SAFE, specificato dall'autorizzazione a livello di accesso EXTERNAL ACCESS. L'autorizzazione EXTERNAL ACCESS dovrebbe, pertanto, essere concessa solo agli accessi attendibili per l'esecuzione del codice nell'account del servizio SQL Server.