Si desarrollamos una aplicación que deberá tener acceso a ciertos recursos del sistema restingidos normalmente por motivos de seguridad (por ejemplo acceso al sistema de archivos) es posible que en determinados casos falle por carecer de dichos permisos.

Esta carencia de permisos puede deberse a configuración del sistema (por ejemplo permisos NTFS) o bien por la cofiguración de permisos de la propia plataforma .NET (por ejemplo un ensamblado que se ejecute desde Internet o desde la Intranet).

¿No sería interesante en estos casos hacer que la aplicación, directamente, ni siquiera se ejecutase si no tiene los permisos suficientes?

Se puede conseguir este efecto declarando directamente en el ensamblado qué permisos son necesarios. Incluso más interesante aún: se pueden restringir más todavía los permisos de nuestro programa respecto a los que le otorga el propio entorno (.NET o el sistema operativo) evitando así un uso indebido de nuestras aplicaciones.

Para conseguirlo lo que se hace es utilizar atributos de tipo PermissionSetAttribute de manera declarativa asociados al ensamblado (en .NET los permisos se controlan siempre dentro del ámbito de cada ensamblado).

Por ejemplo, supongamos que, para poder funcionar, uno de nuestros programas necesita permiso para acceder sin restricciones (leer, escribir, crear, borrar...) al sistema de archivos. Deberíamos indicarlo mediante el siguiente atributo:

[assembly:FileIOPermission(SecurityAction.RequestMinimum, Unrestricted=true)]
public class MiClaseparaArchivos {
....
}

Se pueden colocar diversos atributos de este tipo seguidos para indicar múltiples necesidades. De hecho se pueden colocar varios del mismo tipo para indicar permisos necesarios, opcionales e incluso permisos que no queremos que se le concedan al ensamblado. Esto úlitmo se consigue de manera análoga a esta:

[assembly:EnvironmentPermission(SecurityAction.RequestRefuse, Read="USERNAME"]

Esta línea indica que no se permitirá leer ni escribir la variable de entorno que indica el nombre del usuario actual, evitando así que se use nuestro programa para obtener o cambiar dicho dato.

No se puede desde código (obviamente) cambiar los permisos que tiene la aplicación para concederle otros más amplios, aunque como acabamos de ver sí restringirlos. Los tres posibles valores en SecurityAction son:

  • RequestMinimum (primer ejemplo)
  • RequestOptional
  • RequestRefuse (visto en el último ejemplo)

 

Escrito por un humano, no por una IA