Peticiones de seguridad

Para garantizar que sólo los llamadores que hayan recibido un permiso especificado puedan llamar al código, se puede exigir de manera declarativa o imperativa que los llamadores del código tengan un permiso o un conjunto de permisos específico. Una petición hace que el motor en tiempo de ejecución realice una comprobación de seguridad para imponer restricciones en el código que realiza la llamada. Durante una comprobación de seguridad, el motor en tiempo de ejecución recorre la pila de llamadas, examinando los permisos de cada llamador de la pila y determinando si el permiso que se exige ha sido concedido a cada llamador. Si se detecta un llamador que no posee el permiso solicitado, se produce un error en la comprobación de seguridad y se produce una excepción SecurityException. Las únicas peticiones que no generan un recorrido de pila son las peticiones de vínculos, que sólo comprueban el llamador inmediato.

Se puede conseguir que se produzca una comprobación de seguridad cada vez que se llame a un método concreto o antes de que se ejecute un bloque de código determinado. Si desea que la comprobación de seguridad se produzca cuando se llame a cualquier miembro de una clase determinada, podrá colocar una petición antes de la clase de manera que se aplique a todos sus miembros. A continuación, se explica cómo se realizan las peticiones de seguridad, cuándo deben realizarse y por qué se debe elegir un tipo de petición de seguridad y no otro.

Si escribe una biblioteca que obtiene acceso directamente a un recurso protegido y dicho acceso se expone al llamador, deberá realizar una petición de seguridad en la biblioteca para ayudar a comprobar que todos los llamadores de la pila de llamadas tienen permiso de acceso a ese recurso. Las peticiones pueden ser declarativas o imperativas. Tenga en cuenta que las peticiones 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 en un constructor de clases no está bien definido, las peticiones colocadas en los constructores de clases pueden generar resultados inesperados y no deseados.

Siga las directrices que se exponen a continuación, sea cual sea el tipo de petición que vaya a realizar:

  • Asegúrese de que el llamador se originó en un sitio o en una zona concretos, o que un editor determinado lo ha firmado; para ello, exija que los llamadores tengan un permiso de identidad específico. No obstante, sólo deberá hacer esto cuando proporcione acceso adicional basándose en la coincidencia de identidades, no cuando vaya a negar el acceso basándose en dicha coincidencia. Dado que es relativamente sencillo modificar o enmascarar la identidad del código, negar el acceso basándose únicamente en la identidad no es una manera segura de proteger del acceso no autorizado el código y los recursos a los que el código obtiene acceso.

  • Asegúrese de que sólo los llamadores que tengan un permiso específico pueden crear un objeto; para ello, coloque la petición en el nivel de clase de ese objeto. Supongamos, por ejemplo, que tiene una clase denominada myFileStream, que se deriva de la clase FileStream, y desea asegurarse de que sólo los llamadores autorizados puedan crear instancias de myFileStream. Entonces, debe colocar una petición declarativa de un objeto FileIOPermission que representa el derecho de acceso a la secuencia creada por myFileStream en el nivel de clase de la clase myFileStream.

  • También puede colocar peticiones en código que establezca u obtenga una propiedad. En general, las peticiones de permisos menos restrictivos se colocan en el descriptor de acceso Get y no en el descriptor de acceso Set, a no ser que la propiedad contenga información confidencial, como una contraseña.

    Nota

    Las comprobaciones de seguridad basadas en funciones tienen una semántica ligeramente diferente a la de las comprobaciones de seguridad de acceso a código. Para obtener más información, vea Seguridad basada en funciones.

    Nota

    Sólo se pueden aplicar peticiones en las clases, métodos, eventos y propiedades; las demandas no protegen ensamblados ni miembros individuales que no tengan variables privadas. Las peticiones que se colocan en el ensamblado o en un nivel de variable que no sea privada no dan lugar a una advertencia del compilador. Por tanto, es importante utilizar propiedades, en vez de miembros públicos, para garantizar la protección que proporcionan las peticiones.

Vea también

Referencia

SecurityException Class

Conceptos

Escribir bibliotecas de clases seguras

Otros recursos

Seguridad de acceso a código