更新安全策略

更新:2007 年 11 月

默认安全策略不知道任何自定义权限的存在。例如,Everything 命名权限集包含运行库提供的所有内置代码访问权限,但不包括任何自定义权限。若要更新安全策略以便安全策略知道您的自定义权限,则必须执行下列三种操作:

  • 使策略知道您的自定义权限。

  • 将程序集添加到受信任的程序集列表中。

  • 通知安全策略应当向您的自定义权限授予什么代码。

使策略知道您的自定义权限

若要使策略知道您的自定义权限,则必须:

  • 创建新的命名权限集,该权限集将包括您的自定义权限。(可以修改现有的命名权限集,而不创建新的。)

  • 为权限集取一个名称。

  • 通知安全策略该命名的权限集已经存在。

有关更多信息,请参见代码访问安全策略工具 (Caspol.exe).NET Framework 配置工具 (Mscorcfg.msc)。可以采用以下几种方式之一来添加新的权限集。通过使用代码访问安全策略工具 (Caspol.exe),您可以创建一个包含自定义权限集的 XML 表示形式的 .xml 文件,然后将此文件添加到将运行此代码的计算机的安全策略中。通过使用 .NET Framework 配置工具 (Mscorcfg.msc),可以复制现有权限集,并将权限的 XML 表示形式添加到新的权限集中。

若要保证您的 XML 表示形式有效并且能正确地表示您的权限,可以使用类似于下面的示例的代码来生成 XML 表示形式。注意,此代码创建名为 MyCustomPermission 的自定义权限,并将其初始化为无限制的状态。如果您的自定义权限未实现 IUnrestrictedPermission,或者您不想将策略设置为以无限制的状态向您授予权限,请使用构造函数将权限初始化为您想让它具有的状态。

Imports System
Imports System.IO
Imports System.Security
Imports System.Security.Permissions

Class PSetXML
   Public Shared Sub Main()
      Dim perm As New MyCustomPermission(PermissionState.Unrestricted)
      Dim pset As New NamedPermissionSet("MyPermissionSet", PermissionState.None)
      pset.Description = "Permission set containing my custom permission"
      pset.AddPermission(perm)
      Dim file As New StreamWriter("mypermissionset.xml")
      file.Write(pset.ToXml())
      file.Close()
   End Sub
End Class
using System;
using System.IO;
using System.Security;
using System.Security.Permissions;

class PSetXML {
   public static void Main() 
   {
   MyCustomPermission perm = 
    new MyCustomPermission(PermissionState.Unrestricted);
   NamedPermissionSet pset = 
    new NamedPermissionSet("MyPermissionSet", PermissionState.None);
   pset.Description = "Permission set containing my custom permission";
   pset.AddPermission(perm);
   StreamWriter file = new StreamWriter("mypermissionset.xml");
   file.Write(pset.ToXml());
   file.Close();
   }
}

在创建包含您的权限集的 .xml 文件后,可以将它添加到安全策略中。若要使用 Caspol.exe,请在命令行上键入下面一行:

caspol –machine –addpset mypermissionset.xml

当 Caspol.exe 询问您是否要将包含您的自定义权限的程序集添加到受信任的程序集列表中时,请键入 yes

若要使用 .NET Framework 配置工具添加包含您的权限集的 .xml 文件,请选择**“运行库安全策略”节点,然后选择要修改的策略级别。右击“权限集”并选择“新建”**。使用向导来添加权限集。

将程序集添加到受信任的程序集列表中

因为您的自定义权限将参与 .NET Framework 安全系统,所以它必须完全受信任(就像安全系统依靠的任何代码都必须完全受信任一样)。可通过将您的程序集添加到受信任的程序集列表中来为您的程序集获取完全信任。在使用 Caspol.exe 将您的自定义权限的程序集添加到该列表中后(如上文所述),还必须将您的权限类引用的任何程序集添加到该列表中。若要使用 Caspol.exe 向该列表中添加其他程序集,请在命令行上键入下面一行:

caspol -addfulltrust mypermissionset.dll

若要查看完全受信任的程序集的列表,请使用下面的命令:

caspol -listfulltrust

因为安全系统将完全信任您的自定义权限的程序集(以及它引用的任何程序集),所以对这些文件用加密型强名称进行签名很重要。如果一个程序集没有强名称,则 Caspol.exe 不会将它添加到完全信任列表中。

若要使用 .NET Framework 配置工具将一个程序集添加到完全受信任的程序集列表中,请右击**“运行库安全策略”节点并选择“信任程序集”**。使用向导使程序集成为受信任的程序集。

警告 如果实现自定义安全对象的程序集引用其他程序集,则必须首先将被引用的程序集添加到完全信任程序集列表中。使用 Visual Basic、Visual C++ 或 JScript 创建的自定义安全对象分别引用 Microsoft.VisualBasic.dll、Microsoft.VisualC.dll 或 Microsoft.JScript.dll。默认情况下,完全信任程序集列表中不包含这些程序集。在添加自定义安全对象之前,必须将相应的程序集添加到完全信任列表中。如果不这样做,将会破坏安全系统,导致所有程序集都无法加载。在这种情况中,Caspol.exe -all -reset 选项不会修复安全系统。若要修复安全系统,必须手动编辑安全文件,移除自定义安全对象。

设置策略来授予您的自定义权限

必须使新的权限集与相应的代码组关联,以便安全策略将自定义权限授予应该拥有该权限的代码。执行此操作的方法有两种:一是修改现有代码组;一是添加新的代码组,该代码组标识应当被授予您的自定义权限的代码集。有关代码组的更多信息,请参见安全策略。 使用下面的 Caspol.exe 命令来使 mypermissionset 成为授予符合 LocalIntranet 代码组成员条件的代码的权限集:

caspol -user -chggroup 1.2. mypermissionset

在这个示例中,标签 1.2 表示代码组 LocalIntranet。若要显示所有的代码组及其关联的标签,请使用下面的命令:

caspol -list

若要查看权限集列表,请使用下面的命令:

caspol -listpset

若要使用 .NET Framework 配置工具使 mypermissionset 成为授予 LocalIntranet 代码组的成员的权限集,请选择**“运行库安全策略”节点,然后选择“计算机”策略。右击“LocalIntranet_Zone”节点并选择“属性”。使用“权限集”**选项卡更改权限集。

请参见

概念

创建自己的代码访问权限

安全策略

参考

代码访问安全策略工具 (Caspol.exe)

.NET Framework 配置工具 (Mscorcfg.msc)

IUnrestrictedPermission

其他资源

代码访问安全性