Hinzufügen der Unterstützung der deklarativen Sicherheit

Aktualisiert: November 2007

Obwohl dies nicht unbedingt erforderlich ist, sollte eine benutzerdefinierte Berechtigung deklarative Sicherheit unterstützen. Entwickler können dann die benutzerdefinierte Berechtigung angeben, wenn sie für Sicherheitsaktionen wie Anforderungen, Forderungen oder Assertionen deklarative Syntax verwenden. Berechtigungsanforderungen, Verknüpfungsforderungen und Vererbungsforderungen können nur deklarativ erstellt werden. Daher kann eine benutzerdefinierte Codezugriffsberechtigung mit Verknüpfungsforderungen oder Vererbungsforderungen nur dann angefordert bzw. verwendet werden, wenn Sie Unterstützung für deklarative Sicherheit bereitstellen. In diesem Thema wird das Implementieren einer Attribute-Klasse beschrieben, die Unterstützung deklarativer Sicherheit für eine benutzerdefinierte Berechtigung ermöglicht.

Hinweis:

Die Attributversion der benutzerdefinierten Berechtigung muss in einer anderen Assembly definiert werden als der, von der aus auf sie verwiesen wird. Die benutzerdefinierte Berechtigung sollte auch in dieser Assembly definiert werden. Für die deklarative Sicherheit ist dies obligatorisch, da das Attribut beim Laden der Assembly ausgeführt wird, und das Attribut möglicherweise noch nicht erstellt wurde, wenn sein Verweis festgestellt wird. Der Versuch, eine deklarative Berechtigung in der gleichen Assembly zu verwenden, in der sie definiert ist, löst eine TypeLoadException aus.

Sicherheitsattribute für Deklarationen müssen direkt oder indirekt von der SecurityAttribute-Klasse abgeleitet werden. Im Fall von Codezugriffsberechtigungen wird die Attributklasse von CodeAccessSecurityAttribute abgeleitet, die wiederum von SecurityAttribute abgeleitet ist. Sicherheitsattributklassen müssen die CreatePermission-Methode implementieren, die eine Instanz des Berechtigungsobjekts aus der zugeordneten benutzerdefinierten Berechtigung erstellt. Beachten Sie, dass diese zugeordnete Berechtigungsklasse mit SerializableAttribute gekennzeichnet sein muss, um durch den Compiler in Metadaten serialisiert werden zu können. Weitere Informationen finden Sie unter Implementieren einer benutzerdefinierten Berechtigung.

Im folgenden Code wird eine Attributklasse für die boolesche Berechtigung CustomPermission implementiert. In diesem Beispiel weist die Berechtigungsklasse eine einzige boolesche Unrestricted-Eigenschaft auf, die ihren Zustand enthält.

<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);
      }
   }
}

In diesem Fall überprüft CreatePermission die interne Unrestricted-Eigenschaft und erstellt die entsprechende Instanz eines CustomPermission-Objekts. Während hier nur die Unrestricted-Eigenschaft verwendet wird, müssen andere Klassen benutzerdefinierter Berechtigungsattribute alle möglichen Zustände der von ihnen unterstützten Berechtigungsobjekte unterstützen.

Die Verwendung von CustomPermissionAttribute wird in der folgenden Deklaration einer Forderung veranschaulicht:

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

Siehe auch

Konzepte

Erstellen von eigenen Codezugriffsberechtigungen

Implementieren einer benutzerdefinierten Berechtigung

Referenz

SecurityAttribute

CodeAccessSecurityAttribute

SerializableAttribute

Weitere Ressourcen

Erweitern von Metadaten mithilfe von Attributen

Codezugriffssicherheit