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