Přidání deklarativní podpory zabezpečení
Přestože to není nezbytně nutné, tak by vlastní oprávnění mělo podporovat deklarativní zabezpečení, aby vývojáři mohli specifikovat vlastní oprávnění při použití deklarativní syntaxe pro akce zabezpečení, jako jsou požadavky, žádosti nebo výrazy. Ve skutečnosti mohou být požadavky oprávnění, požadavky na propojení a požadavky dědičnosti provedeny pouze deklarativně. Z tohoto důvodu vaše přístupová oprávnění vlastního kódu nemohou být požadovány nebo použity s požadavky na propojení nebo s požadavky dědičnosti, pokud neposkytujete podporu pro deklarativní zabezpečení. Toto téma popisuje, jak implementovat třídu Attribute, která umožňuje podporu deklarativního zabezpečení pro vaše vlastní oprávnění.
Poznámka |
---|
Verze attribute vlastního oprávnění musí být definována v jiném sestavení než je sestavení, ve kterém je odkazována.Vlastní oprávnění by mělo být také definováno v tomto sestavení.Toto je povinné pro deklarativní zabezpečení, protože attribute je spuštěn, když je sestavení načteno a attribute možná nebyl vytvořen v době, kdy na něj je zjištěn odkaz.Při pokusu o použití deklarativního oprávnění ve stejném sestavení, ve kterém je definována vyústí ve vyvolání výjimky TypeLoadException. |
Atributy zabezpečení pro deklarace musí být odvozeny (buď přímo nebo nepřímo) z třídy SecurityAttribute. Pokud je oprávnění oprávněním přístupu kódu, tak třída atributů je odvozena z třídy CodeAccessSecurityAttribute, která je odvozena z třídy SecurityAttribute. Třídy atributů zabezpečení musí implementovat metodu CreatePermission, která vytváří instanci objektu oprávnění z asociovaného vlastního oprávnění. Všimněte si, že tato vlastní třída oprávnění musí být označena pomocí SerializableAttribute, aby mohla být kompilátorem serializovaná do metadat. Další informace naleznete v tématu Implementing a Custom Permission.
Následující kód implementuje třídu atributů pro oprávnění typu Boolean s názvem CustomPermission. V tomto příkladě má třída oprávnění jednu logickou vlastnost Unrestricted, která obsahuje její stav.
<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);
}
}
}
V tomto případě CreatePermission zkontroluje vnitřní vlastnost Unrestricted a vytvoří příslušnou instanci objektu CustomPermission. Zatímco v tomto případě je použita pouze vlastnost Unrestricted, jiná třída atributů vlastního oprávnění by měla podporovat všechny možné stavy objektu oprávnění, které podporuje.
Použití CustomPermissionAttribute je znázorněno na následující deklaraci požadavku:
<CustomPermissionAttribute(SecurityAction.Demand, Unrestricted := true)>
[CustomPermissionAttribute(SecurityAction.Demand, Unrestricted = true)]
Viz také
Odkaz
Koncepty
Rozšíření metadat pomocí atributů