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 Attribute que habilite la compatibilidad con la seguridad declarativa para un permiso personalizado.
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 atributo se deriva de CodeAccessSecurityAttribute, que se deriva de SecurityAttribute. Las clases de atributo 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 atributo 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 atributo 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 Class
CodeAccessSecurityAttribute Class
SerializableAttribute Class
Conceptos
Crear permisos de acceso a código propios
Implementar un permiso personalizado
Otros recursos
Extender metadatos mediante atributos
Seguridad de acceso a código