Peticiones de vínculos

Una petición de vínculo hace que se produzca una comprobación de seguridad durante la compilación Just-In-Time que sólo comprueba el ensamblado de llamada inmediato del código. La vinculación se produce cuando el código se enlaza a una referencia de tipo, incluidas las referencias a punteros a función y las llamadas a métodos. Si el ensamblado de llamada no dispone del permiso necesario para vincularse al código, no se permite el vínculo y se produce una excepción en tiempo de ejecución cuando se carga y ejecuta el código. Las peticiones de vínculos se pueden reemplazar en las clases heredadas del código.

Observe que con este tipo de petición no se realiza un recorrido de pila completo y que el código sigue siendo susceptible a los ataques. Por ejemplo, si un método en el ensamblado A está protegido por una petición de vínculo, un llamador directo en el ensamblado B se evalúa sobre la base 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 sólo los permisos que deben tener los llamadores directos en el ensamblado inmediato que realiza la llamada para establecer un vínculo al código. No especifica los permisos que deben tener los llamadores para ejecutar el código.

Los modificadores de recorrido de pila Assert, Deny, y PermitOnly no afectan a la evaluación de peticiones de vínculos. Como las peticiones de vínculos no realizan ningún recorrido de pila, los modificadores de recorrido de pila no tienen ningún efecto sobre las peticiones de vínculos.

Si se obtiene acceso a un método protegido por una petición de vínculo a través de la reflexión, la petición de vínculo comprueba el llamador inmediato del código al que se obtiene acceso mediante reflexión. Esto se aplica tanto al descubrimiento de métodos como a la invocación de métodos realizados mediante reflexión. Supongamos, por ejemplo, que el código utiliza la reflexión para devolver un objeto MethodInfo que representa un método protegido por una petición de vínculo y después pasa ese objeto MethodInfo a otro código que lo utiliza para invocar el método original. En este caso, la comprobación de la petición de vínculo tiene lugar dos veces: una vez para el código que devuelve el objeto MethodInfo y otra vez para el código que lo invoca.

Nota

Una petición de vínculo realizada en un constructor de clases estáticas no protege el constructor porque el sistema llama a los constructores estáticos, fuera de la ruta de ejecución de código de la aplicación. Como resultado, cuando se aplica una petición de vínculo a toda la clase, no puede proteger el acceso a un constructor estático, aunque protege el resto de la clase.

En el siguiente fragmento de código se especifica de manera declarativa que cualquier código que se vincule al método ReadData debe tener el permiso CustomPermission. Este permiso es un permiso personalizado hipotético y no existe en .NET Framework. Para realizar la petición, se pasa al atributo CustomPermissionAttribute un indicador SecurityAction.LinkDemand.

<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én

Conceptos

Peticiones de seguridad
Crear permisos de acceso a código propios
Agregar compatibilidad con la seguridad declarativa

Otros recursos

Extender metadatos mediante atributos
Seguridad de acceso a código