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.
Nota |
---|
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
Conceptos
Extender metadatos mediante atributos
Crear permisos de acceso a código propios