Partilhar via


Representação e segurança de integração CLR

Quando código gerenciado acessa recursos externos, o SQL Server não representa automaticamente o contexto de execução atual no qual a rotina está em execução. O código nos assemblies EXTERNAL_ACCESS e UNSAFE pode representar explicitamente o contexto de execução atual.

ObservaçãoObservação

No SQL Server 2008, existem alterações no comportamento de representação. Para obter mais informações, consulte Alterações em recursos do Mecanismo de Banco de Dados que causam interrupção no SQL Server 2008.

O provedor de acesso a dados em processo oferece uma interface de programação de aplicativo, SqlContext.WindowsIdentity, que pode ser usada para recuperar o token associado ao contexto de segurança atual. O código gerenciado nos assemblies EXTERNAL_ACCESS e UNSAFE pode usar esse método para recuperar o contexto e usar o método WindowsIdentity.Impersonate do .NET Framework para representar esse contexto. As restrições seguintes se aplicam quando o código do usuário é representado explicitamente:

  • O acesso a dados em processo não é permitido quando o código gerenciado está em um estado representado. O código pode desfazer a representação e chamar o acesso a dados em processo. Observe que isso exige o armazenamento do valor de retorno (um objetoWindowsImpersonationContext) do método original Impersonate e chamada do método Undo em WindowsImpersonationContext.

    Essa restrição significa que, quando ocorre o acesso a dados em processo, ele é sempre no contexto do contexto de segurança atual em vigor da sessão. Ele não pode ser modificado por meio da representação explícita no código gerenciado.

  • No código gerenciado em execução assíncrona (por exemplo, por meio de assemblies UNSAFE que criam threads e que executam códigos de maneira assíncrona), o acesso a dados em processo jamais é permitido. Isso é verdadeiro, independentemente de haver ou não representação.

Quando o código está em execução em um contexto sem representação diferente de SQL Server, ele não pode realizar chamadas de acesso a dados em processo; ele deve desfazer o contexto de representação antes de fazer as chamadas. Quando o acesso a dados em processo é feito no código gerenciado, o contexto de execução original do ponto de entrada Transact-SQL no código gerenciado é sempre usado na autorização.

Os assemblies EXTERNAL_ACCESS e UNSAFE acessam recursos do sistema operacional usando a conta de serviço do SQL Server, a menos que representem de maneira voluntária o contexto de segurança atual conforme a descrição. Por conta disso, os autores dos assemblies EXTERNAL_ACCESS exigem um nível de confiança mais elevado do que os de assemblies SAFE, especificado pela permissão em nível de logon EXTERNAL ACCESS. Apenas logons confiáveis para a execução de códigos na conta de serviço do SQL Server devem receber a permissão EXTERNAL ACCESS.