Invalidar comprobaciones de seguridad

Actualización: noviembre 2007

Normalmente, una comprobación de seguridad examina todos los llamadores de la pila de llamadas para garantizar que a cada llamador se le ha concedido el permiso especificado. Sin embargo, se puede invalidar el resultado de las comprobaciones de seguridad mediante una llamada a Assert, Deny o PermitOnly en un objeto de permiso concreto o en un objeto de conjunto de permisos. En función del método al que se llame, se puede hacer que la comprobación de seguridad se realice correctamente o no, aunque los permisos de todos los llamadores de la pila no hayan sido comprobados.

Cada vez que un método llama a otro método, se genera un nuevo marco en la pila de llamadas para almacenar información sobre el método al que se llama. (En este contexto, el uso de constructores y el acceso a propiedades se consideran llamadas a métodos). Cada marco de pila incluye información sobre todas las llamadas que el método realiza a Assert, Deny o PermitOnly. Si un llamador utiliza más de una vez Assert, Deny o PermitOnly en la misma llamada a método, el motor en tiempo de ejecución aplica las siguientes reglas de procesamiento, que pueden afectar a los comportamientos del reemplazo:

  • Si, durante el recorrido de pila, el motor en tiempo de ejecución descubre más de un reemplazo del mismo tipo (es decir, dos llamadas a Assert) en un mismo marco de pila, el segundo reemplazo hace que se produzca una excepción.

  • Cuando hay distintos reemplazos en el mismo marco de pila, el motor en tiempo de ejecución los procesa en el orden siguiente: primero PermitOnly, después Deny y, por último, Assert.

Para reemplazar una invalidación, llame primero al método de reversión correspondiente (por ejemplo, RevertAssert) y, después, aplique la nueva invalidación.

Nota:

Los reemplazos de recorrido de pila nunca deben realizarse en constructores de clases, porque no se puede garantizar que el código de los constructores de clases se vaya a ejecutar en un punto determinado o en un contexto determinado. Dado que el estado de la pila de llamadas de los constructores de clases no está bien definido, los reemplazos de recorrido de pila colocados en los constructores pueden generar resultados inesperados y no deseados.

Normalmente, los programadores de aplicaciones no necesitan utilizar Assert, Deny o PermitOnly, y los programadores de componentes y bibliotecas de clases en raras ocasiones. No obstante, los reemplazos de seguridad son adecuados en algunas situaciones, que se describen en los temas Assert, Deny y PermitOnly.

Nota:

Si realiza un reemplazo (Deny, Assert o PermitOnly), debe revertir el permiso antes de realizar la misma clase de reemplazo en el mismo marco de la pila (es decir, en el método). De lo contrario, se inicia una excepción SecurityException. Por ejemplo, si deniega un permiso, P, debe revertir ese permiso antes de denegar otro permiso , Q, en el mismo método.

Utilice uno de los métodos estáticos que se enumeran en la tabla siguiente para revertir un reemplazo.

Método

Acción del método

CodeAccessPermission.RevertAll

Hace que se quiten todos los reemplazos anteriores del marco actual y que ya no estén activos.

CodeAccessPermission.RevertAssert

Hace que se quite cualquier Assert anterior del marco actual y que ya no esté activo.

CodeAccessPermission.RevertDeny

Hace que se quite cualquier Deny anterior del marco actual y que ya no esté activo.

CodeAccessPermission.RevertPermitOnly

Hace que se quite cualquier PermitOnly anterior del marco actual y que ya no esté activo.

Adiciones de comunidad

Mostrar: