Agregar compatibilidad con la seguridad declarativa

Aunque no es estrictamente necesario, un permiso personalizado debe admitir la seguridad declarativa de modo que los programadores puedan especificar el permiso personalizado al utilizar la sintaxis declarativa para acciones de seguridad tales como solicitudes, peticiones o aserciones. De hecho, las solicitudes de permiso, las peticiones de vínculo y las peticiones de herencia sólo se pueden realizar declarativamente. Por esta razón, un permiso de acceso a código personalizado no se puede solicitar ni utilizar con peticiones de vínculo o peticiones de herencia, a menos que se proporcione compatibilidad con la seguridad declarativa. En este tema se explica cómo implementar una clase de atributos que habilite la compatibilidad con la seguridad declarativa para un permiso personalizado.

NotaNota

La versión del atributo del permiso personalizado debe definirse en un ensamblado distinto del ensamblado en el que se le hace referencia.El permiso personalizado también debe definirse en ese ensamblado.Esto es obligatorio en la seguridad declarativa, ya que el atributo se ejecuta cuando se carga el ensamblado, y es posible que no se haya creado en el momento en que se encuentra su referencia.Si se intenta utilizar un permiso declarativo en el mismo ensamblado en el que se definen los resultados, se produce una excepción TypeLoadException.

Los atributos de seguridad de las declaraciones deben derivarse (directa o indirectamente) de la clase SecurityAttribute. Si se trata de un permiso de acceso a código, la clase de atributos se deriva de CodeAccessSecurityAttribute, que se deriva de SecurityAttribute. Las clases de atributos de seguridad deben implementar el método CreatePermission, que crea una instancia del objeto de permiso a partir del permiso personalizado asociado. Observe que esta clase de permiso personalizado asociado debe marcarse con SerializableAttribute para que el compilador la pueda serializar en los metadatos. Para obtener más información, vea Implementar un permiso personalizado.

El código siguiente implementa una clase de atributos para un permiso booleano denominado CustomPermission. En este ejemplo, la clase de permiso tiene una sola propiedad Unrestricted booleana que contiene su estado.

<AttributeUsageAttribute(AttributeTargets.All, AllowMultiple := True)> Public Class 
CustomPermissionAttribute

   Inherits CodeAccessSecurityAttribute
   Private myUnrestricted As Boolean = False
   
   Public Shadows Property Unrestricted() As Boolean
      Get
         Return myUnrestricted
      End Get
      Set
         myUnrestricted = value
      End Set
   End Property
    
   Public Sub New(action As SecurityAction)
      MyBase.New(action)
   End Sub
   
   Public Overrides Function CreatePermission() As IPermission
      If Unrestricted Then
         Return New CustomPermission(PermissionState.Unrestricted)
      Else
         Return New CustomPermission(PermissionState.None)
      End If
   End Function
End Class
[AttributeUsageAttribute(AttributeTargets.All, AllowMultiple = true)]
public class CustomPermissionAttribute: CodeAccessSecurityAttribute
{
   bool unrestricted = false;

   public new bool Unrestricted
   {
      get{ return unrestricted; }
      set{ unrestricted = value; }
   }

   public CustomPermissionAttribute(SecurityAction action): base (action)
   {  
   }
   public override IPermission CreatePermission()
   {
      if(Unrestricted)
      {
         return new CustomPermission(PermissionState.Unrestricted);
      }
      else
      {
         return new CustomPermission(PermissionState.None);
      }
   }
}

En este caso, CreatePermission comprueba la propiedad Unrestricted interna y crea la instancia correcta de un objeto CustomPermission. Aunque sólo se utiliza la propiedad Unrestricted en este caso, otras clases de atributos del permiso personalizado deben admitir todos los posibles estados de los objetos de permiso compatibles.

El uso de CustomPermissionAttribute se ilustra en la siguiente declaración de petición:

<CustomPermissionAttribute(SecurityAction.Demand, Unrestricted := true)>
[CustomPermissionAttribute(SecurityAction.Demand, Unrestricted = true)]

Vea también

Referencia

SecurityAttribute

CodeAccessSecurityAttribute

SerializableAttribute

Conceptos

Extender metadatos mediante atributos

Crear permisos de acceso a código propios

Seguridad de acceso del código

Implementar un permiso personalizado