Permitindo chamadores parcialmente confiáveis
Compartilhar bibliotecas de códigos é um cenário comum na integração do CLR (Common Language Runtime), em que um assembly que contém um tipo definido pelo usuário, procedimento armazenado, uma função definida pelo usuário, uma agregação definida pelo usuário, um disparador ou uma classe de utilitário costuma ser acessado por outro assembly ou aplicativo. Bibliotecas de códigos a serem compartilhadas entre vários aplicativos devem ser assinadas com um nome forte.
Apenas aplicativos totalmente confiáveis por parte do sistema de segurança de acesso do código em tempo de execução têm permissão para acessar um assembly de código gerenciado compartilhado não marcado explicitamente com o atributo System.Security.AllowPartiallyTrustedCallers. Um assembly parcialmente confiável (um registrado no SQL Server com o conjunto de permissões SAFE ou EXTERNAL_ACCESS) que tenta acessar um assembly assinado com nome forte sem esse atributo faz com que um System.Security.SecurityException seja lançado. A mensagem de erro exibida é semelhante à seguinte:
Msg 6522, Level 16, State 1, Procedure usp_RSTest, Line 0
A .NET Framework error occurred during execution of user defined
routine or aggregate 'usp_RSTest': System.Security.SecurityException: That assembly does not allow partially trusted callers.
System.Security.SecurityException: at
System.Security.CodeAccessSecurityEngine.ThrowSecurityException(
Assembly asm, PermissionSet granted,PermissionSet refused,
RuntimeMethodHandle rmh, SecurityAction action, Object demand,
IPermission permThatFailed) at
Microsoft.Samples.SqlServer.TestResultSet.Test()
Recomendamos que todos os assemblies registrados no SQL Server, exceto os assemblies adicionados ao cache de assembly global, sejam marcados com o atributo AllowPartiallyTrustedCallers de forma que os assemblies carregados pelo SQL Server podem acessar um ao outro. Os assemblies a serem adicionados ao cache de assembly global devem ser inteiramente examinados em termos de segurança antes de adicionar o atributo AllowPartiallyTrustedCallers, porque o assembly estaria disponível a chamadores parcialmente confiáveis em contextos inesperados. Um assembly não deve ser totalmente confiável (registrado com o conjunto de permissões UNSAFE no SQL Server).
Para obter mais informações, consulte a seção "Usando bibliotecas em código parcialmente confiável" no Software Development Kit do .NET Framework.
Exemplo
Suponhamos que haja uma classe de utilitário que seria útil em muitos aplicativos de integração do CLR do lado do servidor. Por exemplo, ela talvez fosse uma classe que representa os resultados de uma consulta invocada. Para habilitar o compartilhamento desse componente, essa classe de utilitário é colocada em um assembly separado. Dessa forma, o assembly é referenciado em vários outros assemblies que contêm objetos de integração do CLR. Como é usada em muitos aplicativos de servidor diferentes, essa classe de utilitário é examinada cuidadosamente e todos os problemas de segurança são resolvidos. Como o atributo AllowPartiallyTrustedCallers é aplicado ao assembly que contém a classe de utilitário, os objetos de integração do CLR contidos nos assemblies marcados com os conjuntos de permissões SAFE ou EXTERNAL_ACCESS podem usar a classe de utilitário e os métodos, mesmo que estejam em um assembly separado. Para obter um exemplo de como o atributo AllowPartiallyTrustedCallers é usado, consulte o Result Set Sampledisponível no CodePlex; consulte Exemplos do Mecanismo de Banco de Dados do SQL Server para obter mais informações.
Histórico de alterações
Conteúdo atualizado |
---|
Link atualizado para exemplo. |