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 faz com que uma verificação de segurança durante a compilação just-in-time e verifica somente o assembly de chamada imediato 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. Vinculando ocorre quando seu código é 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 tem permissão suficiente para vincular ao seu código, o link não é permitido e uma exceção de tempo de execução é gerada quando o código é 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. Demandas de link podem ser substituídas nas classes que herdam de seu código.Link demands can be overridden in classes that inherit from your code.

Observe que um exame da pilha completa não será executado com esse tipo de demanda e que seu código ainda é suscetível a ataques de atração.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 é protegido por uma demanda de link, um chamador direto no assembly B é 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 indiretamente chama o método no assembly usando o método no assembly B. A demanda de link Especifica que apenas as permissões de direcionam os chamadores no assembly de chamada imediato 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 de todos os chamadores devem ter para executar seu código.It does not specify the permissions all callers must have to run your code.

O Assert, Deny, e PermitOnly modificadores de movimentação de pilha 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 um exame da pilha, os modificadores de movimentação de pilha não têm 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 é acessado por meio de reflexão, em seguida, uma demanda de link verifica 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 descoberta de método e executada usando a reflexão de invocação de método.This is true both for method discovery and for method invocation performed using reflection. Por exemplo, suponha que o código usa reflexão para retornar um MethodInfo do objeto que representa um método protegido por uma demanda de link e, em seguida, passa que MethodInfo objeto 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 MethodInfo objeto e uma vez para o código que o chama.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, ele não pode proteger o acesso a um construtor estático, embora ele protege 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 declarativamente Especifica que qualquer código de vinculação para o ReadData método deve ter o CustomPermission 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 solicitação é feita, passando um SecurityAction.LinkDemand sinalizador como 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

AtributosAttributes
Segurança de acesso do códigoCode Access Security