Emitir atributos de seguridad declarativa

Emitir atributos de seguridad declarativa para ensamblados dinámicos, y para sus tipos y métodos, es equivalente, desde un punto de vista funcional, a codificar las declaraciones .permission y .permissionset para Ilasm.exe (Ensamblador de IL) o a aplicar el atributo PermissionSetAttribute en el código fuente para Visual Basic, C# o C++. Sin embargo, existen diferencias entre el formato de metadatos utilizado para almacenar atributos emitidos y el formato utilizado para almacenar atributos compilados, dependiendo de la versión de .NET Framework.

Formatos de metadatos para seguridad declarativa

En las revisiones de 2005 para la norma ECMA, además del formato XML original, se presentó un nuevo formato de metadatos para almacenar atributos de seguridad declarativa. Para obtener detalles, vea la descripción del objeto binario PermissionSet en la tabla DeclSecurity (sección 22.11 en las revisiones de 2005) en la documentación Partition II de ECMA. La documentación está disponible en línea; consulte ECMA C# y estándares de Common Language Infrastructure MSDN y Estándar ECMA-335 - Common Language Infrastructure (CLI) en el sitio Web de ECMA International.

En todas las versiones de .NET Framework, la seguridad declarativa aplicada mediante la emisión de reflexión se almacena en el antiguo formato de metadatos.

Los permisos de seguridad declarativa en código compilado, que utilizan los compiladores de lenguaje y Ilasm.exe (Ensamblador de IL) en la versión 2.0 de .NET Framework, se almacenan en el nuevo formato.

Los permisos de seguridad declarativa en código compilado, que utilizan los compiladores de lenguaje y Ilasm.exe (Ensamblador de IL) en las versiones 1.0 y 1.1 de .NET Framework, se almacenan en el antiguo formato.

Emitir atributos de seguridad declarativa

Se pueden emitir atributos de seguridad declarativa para ensamblados, tipos, métodos y constructores. Para todos los demás tipos de miembros, la seguridad declarativa se emite para los métodos subyacentes.

Importante

No puede emitir atributos de seguridad declarativa creando objetos PermissionSetAttribute y aplicándolos al ensamblado, tipo o método dinámico mediante el método SetCustomAttribute.

  • Para emitir la seguridad declarativa para un ensamblado dinámico, cree objetos PermissionSet independientes que contengan los permisos necesarios, opcionales y rechazados. Pase estos conjuntos de permisos a la sobrecarga adecuada del método DefineDynamicAssembly. Si no hay permisos que aplicar a una categoría, especifique null para ese parámetro.

    Importante

    No se utilizan permisos necesarios, opcionales y rechazados a menos que el ensamblado dinámico se haya guardado y vuelto a cargar en la memoria o a menos que utilice una sobrecarga del método DefineDynamicAssembly que especifique la evidencia, así como los permisos solicitados, y proporcione un objeto Evidence.Para obtener más información, vea DefineDynamicAssembly.

  • Para emitir la seguridad declarativa para tipos, métodos y constructores en un ensamblado dinámico, cree un objeto PermissionSet que contenga los permisos para cada SecurityAction que desee aplicar. Aplique los permisos mediante el método AddDeclarativeSecurity de TypeBuilder para los tipos, el método AddDeclarativeSecurity de ConstructorBuilder para los constructores y AddDeclarativeSecurity de MethodBuilder para los métodos.

    Nota

    La seguridad declarativa no se admite para los métodos dinámicos definidos mediante la clase DynamicMethod.

  • Para emitir la seguridad declarativa para todas las demás propiedades y eventos, aplique los conjuntos de permisos que desee al método o métodos subyacentes mediante el método AddDeclarativeSecurity de MethodBuilder. Por ejemplo, para emitir la seguridad declarativa para una propiedad, aplique la seguridad declarativa a los métodos del descriptor de acceso get y set de la propiedad.

Durante el desarrollo de código que emite ensamblados dinámicos, se recomienda utilizar una sobrecarga del método DefineDynamicAssembly que especifique una evidencia y permisos, proporcione la evidencia que desea que tenga el ensamblado dinámico e incluya SecurityPermissionFlag.SkipVerification en refusedPermissions. Al rechazar SkipVerification, se garantiza que se comprueba MSIL. Una limitación de esta técnica es que provoca también el inicio de SecurityException cuando se utiliza con código que exige plena confianza.

Vea también

Referencia

DefineDynamicAssembly

ConstructorBuilder

TypeBuilder

MethodBuilder

PermissionSet