Peticiones de vínculosLink Demands

Precaución

Seguridad de acceso del código y código de confianza parcialCode Access Security and Partially Trusted Code

.NET Framework proporciona seguridad de acceso del código (CAS), que es un mecanismo para el cumplimiento de los distintos niveles de confianza en diferentes códigos que se ejecutan en la misma aplicación.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). La seguridad de acceso de código de .NET Framework no debería usarse como mecanismo para reforzar los límites de seguridad basados en el origen del código u otros aspectos de identidad.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 actualizando las guías para reflejar que la seguridad de acceso de código y el código transparente de seguridad no se podrán usar como límites de seguridad con código de confianza parcial, especialmente en código con orígenes desconocidos.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. Le aconsejamos que no cargue ni ejecute código de orígenes desconocidos sin contar con medidas de seguridad alternativas.We advise against loading and executing code of unknown origins without putting alternative security measures in place.

Esta directiva se aplica a todas las versiones de .NET Framework, pero no se aplica a la versión de .NET Framework incluida en Silverlight.This policy applies to all versions of .NET Framework, but does not apply to the .NET Framework included in Silverlight.

Una petición de vínculo hace que se produzca una comprobación de seguridad durante la compilación Just-In-Time y comprueba solo el ensamblado de llamada inmediato del código.A link demand causes a security check during just-in-time compilation and checks only the immediate calling assembly of your code. La vinculación se produce cuando el código se enlaza a una referencia de tipo, incluidas las referencias del puntero de función y las llamadas a métodos.Linking occurs when your code is bound to a type reference, including function pointer references and method calls. Si el ensamblado de llamada no tiene permisos suficientes para vincularse al código, no se permitirá el vínculo y se producirá una excepción en tiempo de ejecución cuando se cargue y ejecute el código.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. Las peticiones de vínculo pueden reemplazarse en las clases que heredan de su código.Link demands can be overridden in classes that inherit from your code.

Tenga en cuenta que no se efectúa ningún recorrido de pila completo con este tipo de petición y que el código sigue siendo vulnerable a ataques.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 ejemplo, si un método del ensamblado A está protegido por una petición de vínculo, se evalúa un llamador directo en el ensamblado B en función de los permisos del ensamblado B. Sin embargo, la petición de vínculo no evaluará un método en el ensamblado C si llama indirectamente al método en el ensamblado A utilizando el método en el ensamblado B. La petición de vínculo especifica solo los permisos que los llamadores directos en el ensamblado de llamada inmediato deben tener para vincularse al 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. No especifica los permisos que deben tener todos los llamadores para ejecutar el código.It does not specify the permissions all callers must have to run your code.

Los modificadores de recorrido de pila Assert, Deny y PermitOnly no afectan a la evaluación de las peticiones de vínculo.The Assert, Deny, and PermitOnly stack walk modifiers do not affect the evaluation of link demands. Dado que las peticiones de vínculo no efectúan ningún recorrido de pila, los modificadores de recorrido de pila no tienen ningún efecto sobre las peticiones de vínculo.Because link demands do not perform a stack walk, the stack walk modifiers have no effect on link demands.

Si se tiene acceso a un método protegido por una petición de vínculo a través de la reflexión, una petición de vínculo comprueba el llamador inmediato del código al que se tiene acceso mediante reflexión.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. Esto es válido tanto para la detección de métodos como para la invocación de métodos efectuados por reflexión.This is true both for method discovery and for method invocation performed using reflection. Por ejemplo, supongamos que el código usa MethodInfo la reflexión para devolver un objeto que representa un método protegido por una petición de vínculo y, a continuación, pasa ese objeto MethodInfo a otro código que usa el objeto para invocar el 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. En este caso, la comprobación de la petición de vínculo se produce dos veces: una vez para el código que devuelve el objeto MethodInfo y otra para el código que lo 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.

Nota

Una petición de vínculo efectuada en un constructor de clases estáticas no protege el constructor, puesto que el sistema llama a los constructores estáticos, fuera de la ruta de acceso de ejecución del código de la aplicación.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, al aplicar una petición de vínculo a toda una clase, no puede proteger el acceso a un constructor estático, aunque proteja el resto de la clase.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.

El siguiente fragmento de código especifica de manera declarativa que cualquier código vinculado al método ReadData debe tener el permiso CustomPermission.The following code fragment declaratively specifies that any code linking to the ReadData method must have the CustomPermission permission. Este permiso es un permiso personalizado hipotético y no existe en .NET Framework.This permission is a hypothetical custom permission and does not exist in the .NET Framework. La petición se realiza pasando una marca SecurityAction. LinkDemand a 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.  
}  

Vea tambiénSee also