Demandas de linkLink Demands

Cuidado

Segurança de Acesso do Código e Código Parcialmente ConfiávelCode Access Security and Partially Trusted Code

O .NET Framework fornece um mecanismo para a imposição de níveis variáveis de confiança em códigos diferentes em execução no mesmo aplicativo chamado CAS (Segurança de Acesso do Código).The .NET Framework provides a mechanism for the enforcement of varying levels of trust on different code running in the same application called Code Access Security (CAS). O CAS no .NET Framework não deve ser usado como um mecanismo de imposição de limites de segurança com base na origem do código ou em outros aspectos da identidade.Code Access Security in .NET Framework should not be used as a mechanism for enforcing security boundaries based on code origination or other identity aspects. Estamos atualizando nossas diretrizes para refletir que o CAS e o Código Transparente de Segurança não terão suporte como um limite de segurança com código parcialmente confiável, especialmente o código de origem desconhecida.We are updating our guidance to reflect that Code Access Security and Security-Transparent Code will not be supported as a security boundary with partially trusted code, especially code of unknown origin. Não aconselhamos carregar e executar códigos de origens desconhecidas sem a adoção de medidas de segurança alternativas no local.We advise against loading and executing code of unknown origins without putting alternative security measures in place.

Essa política é aplicável à todas as versões do .NET Framework, mas não é aplicável ao .NET Framework incluído no Silverlight.This policy applies to all versions of .NET Framework, but does not apply to the .NET Framework included in Silverlight.

Uma demanda de link causa uma verificação de segurança durante a compilação just-in-time e verifica apenas o assembly de chamada imediata do seu código.A link demand causes a security check during just-in-time compilation and checks only the immediate calling assembly of your code. A vinculação ocorre quando seu código está associado a uma referência de tipo, incluindo referências de ponteiro de função e chamadas de método.Linking occurs when your code is bound to a type reference, including function pointer references and method calls. Se o assembly de chamada não tiver permissão suficiente para vincular ao seu código, o link não será permitido e uma exceção de tempo de execução será lançada quando o código for carregado e executado.If the calling assembly does not have sufficient permission to link to your code, the link is not allowed and a runtime exception is thrown when the code is loaded and run. As demandas de link podem ser substituídas em classes que herdam do seu código.Link demands can be overridden in classes that inherit from your code.

Observe que uma movimentação de pilha completa não é executada com esse tipo de demanda e que seu código ainda está suscetível a ataques de chamariz.Note that a full stack walk is not performed with this type of demand and that your code is still susceptible to luring attacks. Por exemplo, se um método no assembly A for protegido por uma demanda de link, um chamador direto no assembly B será avaliado com base nas permissões do assembly B. No entanto, a demanda de link não avaliará um método no assembly C se ele chamar indiretamente o método no assembly A usando o método no assembly B. A demanda de link especifica somente as permissões que os chamadores diretos no assembly de chamada imediata devem ter que vincular ao seu código.For example, if a method in assembly A is protected by a link demand, a direct caller in assembly B is evaluated based on the permissions of Assembly B. However, the link demand will not evaluate a method in assembly C if it indirectly calls the method in assembly A using the method in assembly B. The link demand specifies only the permissions direct callers in the immediate calling assembly must have to link to your code. Ele não especifica as permissões que todos os chamadores devem ter para executar seu código.It does not specify the permissions all callers must have to run your code.

Os Assertmodificadores de PermitOnly movimentação de pilha, Denye não afetam a avaliação de demandas de link.The Assert, Deny, and PermitOnly stack walk modifiers do not affect the evaluation of link demands. Como as demandas de link não executam uma movimentação de pilha, os modificadores de movimentação de pilha não têm nenhum efeito nas demandas de link.Because link demands do not perform a stack walk, the stack walk modifiers have no effect on link demands.

Se um método protegido por uma demanda de link for acessado por meio de reflexão, uma demanda de link verificará o chamador imediato do código acessado por meio de reflexão.If a method protected by a link demand is accessed through Reflection, then a link demand checks the immediate caller of the code accessed through reflection. Isso é verdadeiro para a descoberta de método e para invocação de método executada usando reflexão.This is true both for method discovery and for method invocation performed using reflection. Por exemplo, suponha que o código use a reflexão MethodInfo para retornar um objeto que representa um método protegido por uma demanda de link e, em seguida, passe esse objeto MethodInfo para algum outro código que usa o objeto para invocar o método original.For example, suppose code uses reflection to return a MethodInfo object representing a method protected by a link demand and then passes that MethodInfo object to some other code that uses the object to invoke the original method. Nesse caso, a verificação de demanda de link ocorre duas vezes: uma vez para o código que retorna o objeto MethodInfo e uma vez para o código que o invoca.In this case the link demand check occurs twice: once for the code that returns the MethodInfo object and once for the code that invokes it.

Observação

Uma demanda de link executada em um construtor de classe estática não protege o construtor porque construtores estáticos são chamados pelo sistema, fora do caminho de execução de código do aplicativo.A link demand performed on a static class constructor does not protect the constructor because static constructors are called by the system, outside the application's code execution path. Como resultado, quando uma demanda de link é aplicada a uma classe inteira, ela não pode proteger o acesso a um construtor estático, embora proteja o restante da classe.As a result, when a link demand is applied to an entire class, it cannot protect access to a static constructor, although it does protect the rest of the class.

O fragmento de código a seguir especifica declarativamente que qualquer vinculação de ReadData código para o método CustomPermission deve ter a permissão.The following code fragment declaratively specifies that any code linking to the ReadData method must have the CustomPermission permission. Essa permissão é uma permissão personalizada hipotética e não existe no .NET Framework.This permission is a hypothetical custom permission and does not exist in the .NET Framework. A demanda é feita passando um sinalizador SecurityAction. LinkDemand para o CustomPermissionAttribute.The demand is made by passing a SecurityAction.LinkDemand flag to the CustomPermissionAttribute.

<CustomPermissionAttribute(SecurityAction.LinkDemand)> _  
Public Shared Function ReadData() As String  
    ' Access a custom resource.  
End Function    
[CustomPermissionAttribute(SecurityAction.LinkDemand)]  
public static string ReadData()  
{  
    // Access a custom resource.  
}  

Consulte tambémSee also