代码访问权限和权限集

16.1.2 C#高级编程:代码访问权限和权限集 
作者:佚名  文章来源:http://www.51shuji.com/  发布日期:2008-02-02  浏览次数:88 
打印这篇文章 
  
想像自己正在一个大公司中管理办公机器网络的安全性策略。在这种情况下,CLR在执行代码之前收集代码的证据是非常有用的;同样,一旦CLR知道了代码来自何处,管理员就应当有机会严格控制代码在所管理的数百台机器上的行为。这个问题需要使用权限来解决。
一旦程序集与代码组相匹配,CLR就会根据安全性策略赋予程序集一些权限。在Windows中管理权限时,通常不是把权限应用到用户身上,而是把权限应用于组。程序集也是如此,也就是说,把权限应用于代码组,而不是各个程序集,这就简化了.NET中安全性策略的管理。
安全性策略指定代码组中的程序集允许执行什么动作。下面列出了 CLR 提供的代码访问权限。从中可以看出,使用这些权限,可以很好地控制允许代码做什么和不允许做什么:
●  DirectoryServicesPermission :通过 System.DirectoryServices 类访问 Active Directory 的能力
● DnsPermission:使用TCP/IP域名系统(DNS)的能力
● EnvironmentPermission:读写环境变量的能力
● EventLogPermission:读写事件日志的能力
●  FileDialogPermission :访问文件的能力。这里的文件是指用户在 Open 对话框中选择的文件。 常用于没有赋予FileIOPermission权限,不能对文件进行有限的访问时。
●  FileIOPermission :处理文件的能力 ( 其中包括读文件、写文件、添加文件的内容,创建、更改 和访问文件夹)
●  IsolatedStorageFilePermission :访问私有虚拟文件系统的能力
● IsolatedStoragePermission:访问孤立存储器的能力,存储器与各个用户相关,并具有代码身份的特征,例如代码的Web站点、签名或发布者
● MessageQueuePermission:通过Microsoft Message Queue使用消息队列的能力
● OleDbPermission:使用OLE DB访问数据库的能力
● PerformanceCounterPermission:利用性能计数器的能力
● PrintingPermission:打印的能力
● ReflectionPermission:使用System.Reflection在运行期间查找类型信息的能力
● RegistryPermission:读、写、创建和删除注册表项和值的能力
● SecurityPermission:执行、断言权限、调用非托管的代码、忽略验证和其他权力的能力
● ServiceControllerPermission:控制Windows服务的能力
● SocketPermission:在网络传输地址上创建或接受TCP/IP连接的能力
● SQLClientPermission:使用SQL Server的.NET数据提供程序访问SQLServer数据库的能力
● UIPermission:访问用户界面的能力
● WebPermission:连接Web或接受Web连接的能力
对于上面的每一个权限类,通常可以指定更深级别的粒度。例如,在本章后面的一个示例中,请求的不仅仅是文件的访问权限,还指定了文件访问的具体级别。
在实践中,如果要利用与上面列出的权限相关的资源,最好在应用程序中加入 try…catch 错误处理程序块,以便应用程序运行在受限制的权限下时,能够很好地进行处理。应用程序的设计应该指定应用程序在这些情况下怎样运行,而不应该假定应用程序运行在开发它时的同一安全性策略下。例如,如果应用程序不能访问本地磁盘,它是应该退出执行呢,还是以另一种方式进行工作呢?
一个程序集将与几个代码组相关联;在安全性策略中,程序集的有效权限是程序集所属的所有代码组中权限的并集。也就是说,程序集匹配的每一个代码组都将扩展程序集的权限。在代码组的树中,下面的代码组具有的权限比上面代码组具有的权限要多一些。
以代码的身份为基础, CLR 可以赋予代码组另外一个权限集合,但是这些权限不能明确地赋予代码组。这些权限与 CLR 收集的关于程序集的证据直接相关,它们称为身份权限 (Identity Permissions) 。下面是身份权限类的名称:
● PublisherIdentityPermission:软件发布者的数字签名
● SiteIdentityPermission:Web站点的名称,代码来自这个Web站点
● StrongNameIdentityPermission:程序集的强名
● URLIdentityPermission:URL,代码来自这个URL(其中包括协议,例如http://)
● ZoneIdentityPermission:程序集来自的区域
通常在程序块中应用权限,这就是 .NET 也提供权限集合的原因。代码访问的权限聚合在已命名的集合中,下面是已命名的权限集合:
● FullTrust:没有权限的限制
● Execution:运行的能力,但是不能访问受保护的资源
● Nothing:没有权限,不能执行
● LocalIntranet:本地内部网的默认策略,它是权限全集的子集。例如,文件IO只能在程序集生成的共享上进行读取访问
●  Internet :未知来源的代码的默认策略,这是限制最严格的策略。例如,在这个权限集合下执行的代码没有文件IO能力,不能读写事件日志,也不能写环境变量
● Everything:这个集合中的所有权限,其中不包括忽略代码验证的权限。管理员可以改变这个权限集合中的权限。默认策略需要比较强大时,可以使用这个权限集合
注意:
只能修改Everything权限集合的定义,而前面5个权限是固定的,不能改变。
因为只有 CLR 能够把身份权限赋予代码,所以身份权限不能包括在权限集合中。例如,如果一段代码是来自具体的发布者,管理员把与另一个发布者相关的身份权限赋予这段代码是毫无意义的。 CLR 在需要时赋予身份权限,这样就可以随时利用那些身份权限。
1. 查看程序集的权限
假定用户在使用一个 Microsoft 应用程序,并试图使用一个以前从没用过的特性。应用程序没有把代码的副本保存在本地,因此必须请求代码,然后下载到全局程序集缓存中。如果代码是由特定的公司 ( 这个公司已经使用证书签署了程序集 ) 通过 Internet 发布的,则程序集所属代码组中的成员关系如图 14-3 所示。
  14-3
依照这个示例中的策略,代码组All Code和Internet Code的权限有限,但图中右下角的代码组却赋予程序集FullTrust权限。程序集的有效权限是它所属所有代码组中权限的并集。当权限以这种方式合并时,有效的权限就是被授予的最高权限,也就是说,程序集所属的每一个代码组都会向程序集的有效权限集中添加权限。
正像可以查看程序集所属的代码组一样,也可以查看赋予程序集所属代码组的权限。在查看权限时,不但能够看到代码的访问权限 ( 即允许代码做什么 ) ,也可以看到代码的身份权限 ( 身份权限能访问代码在运行期间表现出来的证据 ) 。使用如下的命令,可以查看程序集代码组的权限
caspol.exe –resolveperm assembly.dll
对一个程序集使用这个命令,并且查看在通过本地的内部网访问程序集时赋予程序集的代 码访问权限和身份权限。如果输入下面的命令,就可以看到代码访问权限和最后的 3 个身份权限
caspol.exe –resolveperm http://intranet/assembly.dll
 
Microsoft (R) .NET Framework CasPol 1.1.4322.535
Copyright (C) Microsoft Corporation 1998-2002. All rights reserved.
 
Resolving permissions for level = Enterprise
Resolving permissions for level = Machine
Resolving permissions for level = User
Grant =
version="1">
PublicKeyToken=b77a5c561934e089"
  version="1"
  Access="Open"/>
PublicKeyToken=b77a5c561934e089"
  version="1"
  Allowed="DomainIsolationByUser"
  UserQuota="10240"/>
  PublicKeyToken=b77a5c561934e089"
  version="1"
  Flags="Execution"/>
  PublicKeyToken=b77a5c561934e089"
  version="1"
  Window="SafeTopLevelWindows"
  Clipboard="OwnClipboard"/>
PublicKeyToken=b77a5c561934e089"
  version="1">
  
  
 
  PublicKeyToken=b03f5f7f11d50a3a"
  version="1"
  Level="SafePrinting"/>
  PublicKeyToken=b77a5c561934e089"
  version="1"
  Site="some.host.com"/>
PublicKeyToken=b77a5c561934e089"
  version="1"
  Url="http://some.host.com/dev/testdll.dll"/>
  PublicKeyToken=b77a5c561934e089"
  version="1"
  Zone="Internet"/>
 
 
Success
上面的权限都是以XML方式显示出来的,其中包括定义权限的类、包含类的程序集、权限的版本以及加密标记。从中可以看出,我们能够创建自己的权限,在后面的内容中有许多这方面的内容。此外,每一个身份权限都包括更详细的信息,例如UrlIdentityPermission类的详细信息,通过这个类可以访问生成代码的URL等。
在输出结果的开头,要格外注意caspol.exe解决Enterprise、Machine和User级别上权限的方式和列出有效权限的方式。下面讨论策略的这3个级别。
打印正文内容 
与本文主题相关的文章 
      16.2.6 C#高级编程:创建代码访问权限       16.1.2 C#高级编程:代码访问权限和权限集       16.1 C#高级编程:代码访问的安全性
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值