添加声明式安全支持

虽然不是严格要求,但自定义权限应当支持声明式安全性,以便开发人员能够在对安全操作(如请求、要求或断言)使用声明式语法时指定自定义权限。 事实上,权限请求、链接要求和继承要求都只能以声明方式发出。 因此,除非您提供对声明式安全性的支持,否则,将无法请求您的自定义代码访问权限,也不能将该权限与链接要求或继承要求一起使用。 此主题描述如何实现一个 Attribute 类,该类为您的自定义权限启用声明式安全支持。

注意注意

自定义权限的特性版本必须定义在不引用它的程序集中。自定义权限也应定义在该程序集中。对于声明式安全,这是必需的,因为该特性是在程序集加载时执行的,在遇到对该特性的引用时,可能还未创建该特性。如果尝试在定义声明式权限的程序集中使用该权限,将导致引发 TypeLoadException

声明的安全特性必须直接或间接派生自 SecurityAttribute 类。 如果该权限是代码访问权限,则特性类从 CodeAccessSecurityAttribute 派生,后者从 SecurityAttribute 派生。 安全特性类必须实现 CreatePermission 方法,该方法根据关联的自定义权限创建权限对象的一个实例。 请注意,此关联的自定义权限类必须用 SerializableAttribute 标记,才能由编译器序列化到元数据中。 有关更多信息,请参见实现自定义权限

下面的代码为名为 CustomPermission 的布尔型权限实现一个特性类。 在此示例中,该权限类有一个布尔型 Unrestricted 属性,该属性包含该权限类的状态。

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

在此例中,CreatePermission 检查内部 Unrestricted 属性,并创建 CustomPermission 对象的相应实例。 尽管此例中仅使用了 Unrestricted 属性,其他自定义权限特性类应当支持它们所支持权限对象的所有可能的状态。

下面的要求声明中阐释了 CustomPermissionAttribute 的用法:

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

请参见

参考

SecurityAttribute

CodeAccessSecurityAttribute

SerializableAttribute

概念

利用特性扩展元数据

创建自己的代码访问权限

代码访问安全性

实现自定义权限