Sdílet prostřednictvím


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ámkaPozná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

SecurityAttribute

CodeAccessSecurityAttribute

SerializableAttribute

Koncepty

Rozšíření metadat pomocí atributů

Vytvoření vlastního kódu přístupových oprávnění

Zabezpečení přístupu kódu

Implementace vlastního oprávnění