更新:2007 年 11 月
在 .NET Framework 中,代码访问安全会限制代码对受保护资源和操作的访问。每种以公共语言运行库为目标的应用程序都必须与运行库的安全系统进行交互。当应用程序执行时,运行库将自动对它进行计算,然后给它一个权限集。根据应用程序获得的权限不同,应用程序或者正常运行,或者发生安全性异常。
特定计算机上的本地安全设置最终控制授予代码的权限。因为这些设置可能因计算机而异,所以您永远无法确保代码将收到运行所需的足够的权限。有关更多信息,请参见代码访问安全性基础知识。
代码访问权限
代码访问权限对象用于保护资源和操作,以免被未经授权的用户使用。它们是公共语言运行库用来在托管代码上强制安全性限制的机制的基本部分。
代码访问权限允许用户访问受保护的资源(例如文件),或执行受保护的操作(例如访问托管代码)。所有代码访问权限均可通过代码请求获得;而是否授予权限则由运行库决定。每个代码访问权限都是从 CodeAccessPermission 类派生的,因此,这些权限都具有以下常见方法:Assert、Demand、Deny、PermitOnly、IsSubSetOf、Intersec 和 Union。
由 .NET Framework 提供的权限
此表显示由 .NET Framework 提供的代码访问权限。
权限类 |
权限 |
---|---|
访问 ASP.NET 所寄宿的环境中的资源。 |
|
访问 System.DirectoryServices 类。 |
|
访问网络中的域名系统 (DNS) 服务器。 |
|
读取或写入环境变量。 |
|
读取或写入事件日志服务。 |
|
通过“打开”对话框读取或写入文件。 |
|
读取或写入文件或目录。 |
|
读取或写入独立存储的文件或目录。 |
|
通过托管消息队列(又称为 MSMQ)接口访问消息队列。 |
|
访问 ODBC(开放式数据库连接)数据源。 |
|
使用 OLE DB 访问数据库。 |
|
访问 Oracle 数据库。 |
|
访问性能计数器。 |
|
访问打印机。 |
|
确定某类型的运行时信息。 |
|
读取、写入、创建或删除注册表项和值。 |
|
执行、断言权限、调用到非托管代码中、跳过验证以及其他与安全有关的权限。 |
|
访问正在运行的服务或已停止的服务。 |
|
在传输地址上建立或接受连接。 |
|
访问 SQL 数据库。 |
|
访问用户界面功能。 |
|
在 Web 地址上建立或接受连接。 |
创建自己的权限
.NET Framework 提供一组代码访问权限类,旨在帮助保护一组特定的资源和操作,并重点保护由 .NET Framework 公开的那些资源。对于多数环境,内置的代码访问权限已经够用。但在某些情况下,定义自己的代码访问权限类可能会有用。有关更多信息,请参见创建自己的代码访问权限。
标识权限
标识权限表示标识程序集的特性。公共语言运行库根据获取的有关程序集的信息,在加载该程序集时授予其标识权限。有关更多信息,请参见标识权限。
基于角色的权限
商务应用程序经常根据用户提供的凭据提供对数据或资源的访问。通常情况下,这种应用程序会检查用户的角色,并根据该角色提供对资源的访问。公共语言运行库根据 Windows 帐户或自定义标识提供基于角色的授权支持。有关更多信息,请参见基于角色的安全性。
安全任务
下表列出了与权限和安全相关联的任务。
任务 |
请参见 |
---|---|
请求访问非托管代码的权限 |
|
请求可选的权限 |
|
为命名的权限集请求权限 |
|
请求 XML 编码的权限 |
|
拒绝权限 |
|
执行强制性安全检查 |
|
执行声明性安全检查 |
|
重写安全检查 |
|
通过部分受信任的代码共享库 |
|
需要完全信任 AllowPartiallyTrustedCallersAttribute 程序集中的类型 |
|
创建 WindowsIdentity 和 WindowsPrincipal 对象 |
|
创建 GenericPrincipal 和 GenericIdentity 对象 |
.NET Framework 安全策略模型
.NET Framework 安全策略模型由五个元素组成。它们是:
安全策略级别:企业、计算机、用户以及应用程序域。
代码组:充作企业、计算机及用户策略级别中的层次结构。
与每个代码组关联的命名权限集。
提供有关代码标识信息的证据。
向公共语言运行库提供有关代码的证据的应用程序域宿主。
安全策略级别
.NET Framework 提供四种安全策略级别来计算程序集或应用程序域的权限授予。每个级别均包含自己的代码组层次结构和权限集。运行库在进行计算时,允许的权限集将用作策略中所有参与级别所允许的权限的总和
这些级别为:
企业策略。适用于分发了企业配置文件的企业设置中的所有托管代码。
计算机策略。适用于计算机上的所有托管代码。
用户策略。适用于公共语言运行库启动时,与当前操作系统用户关联的所有进程中的代码。
应用程序域策略。适用于宿主的应用程序域中的托管代码。
有关更多信息,请参见安全策略级别。
代码组
代码组是代码的逻辑分组,该分组具有指定的成员条件。所有满足成员条件的代码均包括在该组中。代码组拥有在策略授予过程中计算的关联的权限集。有关更多信息,请参见代码组。
命名的权限集
命名的权限集是管理员可以将其与某个代码组关联的权限集。命名的权限集至少包含一个权限、以及该权限集的名称与说明。多个代码组可以与一个特定的权限集相关联。
此表显示由公共语言运行库提供的命名权限集。
名称 |
说明 |
---|---|
Nothing |
无权限(代码无法运行)。 |
Execution |
拥有运行(执行)权限,但是没有使用受保护资源的权限。 |
Internet |
适用于来源不明的内容的默认策略权限集。 |
Local Intranet |
企业内的默认策略权限集。 |
Everything |
所有标准(内置)权限(跳过验证的权限除外)。 |
FullTrust |
对所有资源的完全访问权。 |
有关更多信息,请参见命名的权限集。
证据
证据是公共语言运行库用以根据安全策略作出决定的信息。证据用于向运行库指示代码具有某种特定的特征,证据可以包括应用程序目录、发行者、网站和 URL。有关更多信息,请参见证据。
应用程序域宿主
每个 .NET Framework 应用程序均在应用程序域中运行,该应用程序域由创建它并向其中加载程序集的宿主所控制。应用程序域可以包括:
浏览器宿主。在网站的上下文中运行代码。
自定义设计的宿主。创建域并将程序集(包括动态程序集)加载到域中。
服务器宿主,运行处理提交到服务器的请求的代码。
外壳程序宿主。从外壳程序启动应用程序(.exe 文件)。
此表列出了与应用程序域相关联的任务:
任务 |
请参见 |
---|---|
创建应用程序域 |
|
设置应用程序域级别安全策略 |
|
配置应用程序域 |
|
调用特定应用程序域中的函数 |
|
从应用程序域中检索安装信息 |
|
卸载应用程序域 |
有关更多信息,请参见AppDomain、应用程序域宿主和对应用程序域进行编程。