4.3 [Enterprise Library]定制中等信任策略
转载请注明出处:http://www.cnblogs.com/doriandeng/archive/2007/10/22/933627.html
下面表格展示了应用程序可能需要的附加权限(那些在默认中等信任策略中授予的之外的)。只有在要使用那些特定的特性时才需要授予这些权限,除非另有说明,否则在定制的策略文件中进行这些修改。
其他如何修改定制的策略文件的例子,请参见 MSDN 上的 How To: Use Medium Trust in ASP.NET 2.0 。如果使用的是部分信任而不是中等信任,可能会应用其他约束和权限。有一个列出了不同权限及允许它们的信任策略的表格,请参见 MSDN 上的 ASP.NET Code Access Security 。
这些附加的权限如下:
-
通用权限
-
缓存应用程序块权限
-
数据访问应用程序块权限
-
异常处理应用程序块权限
-
加密应用程序块权限
-
安全应用程序块权限
-
日志应用程序块权限
-
验证应用程序块权限
-
策略注入应用程序块权限
通用权限
表1列出了 Enterprise Library 核心特性可能需要的附加权限。
表 4.1. 附加通用权限
特性 | 子特性 | 权限 |
---|---|---|
配置 | 无 | 添加 ConfigurationPermission 类到
<SecurityClasses> 元素。在
<IPermission> 元素中,设置
Access 属性为 Unrestricted
以读取策略文件中相应的节。另一种方法是添加 requirePermission = false
到配置文件的相应节中。 |
配置 | 文件配置源 | 添加 FileIOPermission 类到
<SecurityClasses> 元素。在 <IPermission>
元素中,设置 Read 和
PathDiscovery 属性为配置文件的目录和 Machine.config
文件。 |
度量 ( Instrumentation ) | 性能计数器 | 添加 PerformanceCounterPermission 类到
<SecurityClasses> 元素。在
<IPermission> 元素中,设置 Access 属性为
Write 。 |
度量 ( Instrumentation ) | 事件日志 | 添加 EventLogPermission 类到
<SecurityClasses> 元素。在
<IPermission> 元素中,为本地计算机设置 Access
属性为 Administer 。 |
度量 ( Instrumentation ) | Windows 管理度量( WMI ) | WMI 在部分信任下不受支持。 |
缓存应用程序块
表2 列出了缓存应用程序块可能需要的附加权限。
表 4.2. 缓存应用程序块的附加权限
特性 | 子特性 | 权限 |
---|---|---|
存储 | 数据库 | 添加 SecurityPermission 类到
<SecurityClasses> 元素。在
<IPermission> 元素中,添加
SerializationFormatter 标志到 Flags 属性。 |
存储 | IsolatedStorage | 添加 SecurityPermission 类到
<SecurityClasses> 元素。在
<IPermission> 元素中,添加
SerializationFormatter 标志到 Flags
属性。 |
加密 | SymmetricStorage 加密提供程序(来自加密应用程序块) | 添加 DataProtectionPermission 类到
<SecurityClasses> 元素。在
<IPermission> 元素中,添加
ProtectData 和 UnprotectData 标志到
Flags 属性。 |
度量 ( Instrumentation ) | 性能计数器 | 添加 PerformanceCounterPermission 类到
<SecurityClasses> 元素。在
<IPermission> 元素中,设置 Access 属性为
Write ,在 Enterprise Library 缓存计数器类型中。 |
数据访问应用程序块
表3 列出了数据访问应用程序块可能需要的附加权限。
表 4.3. 数据访问应用程序块的附加权限
特性 | 子特性 | 权限 |
---|---|---|
Oracle 数据库 | 无 | 添加 OraclePermission 类到
<SecurityClasses> 元素。在
<IPermission> 元素中,设置
Unrestricted 属性为 true 。 |
Odbc 数据库 | 无 | 添加 OdbcPermission 类到
<SecurityClasses> 元素。在
<IPermission> 元素中,设置
Unrestricted 属性为 true 。 |
OleDb 数据库 | 无 | 添加 OleDbPermission 类到
<SecurityClasses> 元素。在
<IPermission> 元素中,设置
Unrestricted 属性为 true 。 |
SqlCe 数据库 | 无 | SQL Server Compact Edition 在部分信任下不受支持。 |
度量 ( Instrumentation ) | 性能计数器 | 添加 PerformanceCounterPermission 类到
<SecurityClasses> 元素。在
<IPermission> 元素中,设置 Access 属性为
Write ,在 Enterprise Library 数据计数器类型中。 |
异常处理应用程序块
表4列出了异常处理应用程序块可能需要的附加权限。
表 4.4. 异常处理应用程序块的附加权限
特性 | 子特性 | 权限 |
---|---|---|
常规 | 上下文信息 | 添加 SecurityPermission 类到
<SecurityClasses> 元素。在
<IPermission> 元素中,添加
UnmanagedCode 标志到 Flags 属性。 |
度量 ( Instrumentation ) | 性能计数器 | 添加 PerformanceCounterPermission 类到
<SecurityClasses> 元素。在
<IPermission> 元素中,设置 Access 属性为
Write ,在 Enterprise Library 异常处理计数器类型中。 |
加密应用程序块
表5列出了加密应用程序块可能需要的附加权限。
表 4.5. 加密应用程序块的附加权限
特性 | 子特性 | 权限 |
---|---|---|
常规 | 无 | 添加 DataProtectionPermission 类到
<SecurityClasses> 元素。在
<IPermission> 元素中,添加
ProtectData 和 UnprotectData 标志到
Flags 属性。 |
度量 ( Instrumentation ) | 性能计数器 | 添加 PerformanceCounterPermission 类到
<SecurityClasses> 元素。在
<IPermission> 元素中,设置 Access 属性为
Write ,在 Enterprise Library 加密计数器类型中。 |
安全应用程序块
表6 列出了安全应用程序块可能需要的附加权限。
表 4.6. 安全应用程序块的附加权限
特性 | 子特性 | 权限 |
---|---|---|
常规 | 无 | 如果应用程序使用了 IIdentity 和
IPrincipal 对象来代替 GenericIdentity
和 GenericPrincipal
,则可能需要附加权限。例如, WindowsIdentity 对象需要在
<SecurityClasses> 元素中包含
SecurityPermission 类,在
<IPermission> 元素中,添加
UnmanagedCode 标志和 ControlPrincipal 到
Flags 属性。 |
Authorization | AzMan( 授权管理器) | AzMan 在部分信任下不受支持。 |
度量 ( Instrumentation ) | 性能计数器 | 添加 PerformanceCounterPermission 类到
<SecurityClasses> 元素。在
<IPermission> 元素中,设置 Access 属性为
Write ,在 Enterprise Library 安全计数器类型中。 |
日志应用程序块
表7列出了日志应用程序块可能需要的附加权限。
表 4.7. 日志应用程序块的附加权限
特性 | 子特性 | 权限 |
---|---|---|
常规 | 上下文信息 | 添加 SecurityPermission 类到
<SecurityClasses> 元素。在
<IPermission> 元素中,添加
UnmanagedCode 标志到 Flags 属性。 |
跟踪 | 无 | 添加 SecurityPermission 类到
<SecurityClasses> 元素。在
<IPermission> 元素中,添加
UnmanagedCode 标志到 Flags 属性。 |
跟踪监听器 | 常规 | 如果要使用 TraceOptions.Callstack
方法,添加 EnvironmentPermission 类到
<SecurityClasses> 元素。在
<IPermission> 元素中,设置 Access 属性为
Unrestricted 。如果要使用
TraceOptions.ProcessID 方法,添加
SecurityPermission 类到
<SecurityClasses> 元素。在
<IPermission> 元素中,添加 UnmanagedCode
到 Flags 属性。 |
跟踪监听器 | 事件日志 | 添加 EventLogPermission 类到
<SecurityClasses> 元素。在
<IPermission> 元素中,为本地计算机设置 Access
属性为 Administer 。 |
跟踪监听器 | 消息队列 | 消息队列在部分信任下不受支持。 |
跟踪监听器 | Flat File 和 Rolling Flat File (文本文件) | 添加 FileIOPermission 类到
<SecurityClasses> 元素。在
<IPermission> 元素中,设计 Read 和
Write 到目标文件的文件夹;设置 PathDiscovery 和
Append 属性到文件。(文件可以从它的文件夹继承权限)。 |
跟踪监听器 | WMI | WMI 在部分信任下不受支持。 |
跟踪监听器 | 数据库 | 为目标数据库添加适当的数据库权限(请参见用于数据访问 程序块的表3)。 |
格式化程序 | BinaryFormatter 类 |
添加 SecurityPermission 类到
<SecurityClasses> 元素。在
<IPermission> 元素中,添加
SerializationFormatter 到
Flags 属性。 |
格式化程序 | TextFormatter 类 |
没有可添加的权限,尽管如果引用在部分信任下不可用的属性时某些令牌不可用。 |
常规 | ContextItems 类 |
添加 SecurityPermission 类到
<SecurityClasses> 元素。在
<IPermission> 元素中,添加 Infrastructure
标志到 Flags 属性。 |
度量 ( Instrumentation ) | 性能计数器 | 添加 PerformanceCounterPermission 类到
<SecurityClasses> 元素。设置 Access 属性为
Write ,在 Enterprise Library 日志计数器类型中。 |
验证应用程序块
表8列出了验证应用程序块可能需要的附加权限。
表 4.8. 验证应用程序块的附加权限
特性 | 子特性 | 权限 |
---|---|---|
核心 | 无 | 没有常规和中等信任以外特殊权限的需求(本地Intranet)。 |
WinForms | 无 | 没有常规和中等信任以外特殊权限的需求(本地Intranet)。 |
度量 ( Instrumentation ) | 性能计数器 | 添加 PerformanceCounterPermission 类到
<SecurityClasses> 元素。设置 Access 属性为
Write ,在 Enterprise Library 日志计数器类型中。 |
策略注入应用程序块
表 4.9. 策略注入应用程序块的附加权限
特性 | 子特性 | 权限 |
---|---|---|
核心 | 无 | 没有常规和中等信任以外特殊权限的需求(本地Intranet)。 |
WinForms | 无 | 没有常规和中等信任以外特殊权限的需求(本地Intranet)。 |
度量 ( Instrumentation ) | 性能计数器 | 添加 PerformanceCounterPermission 类到
<SecurityClasses> 元素。设置 Access 属性为
Write ,在 Enterprise Library 日志计数器类型中。 |
CallHandlers | PerformanceCountersInstaller | 需要完全信任。 |
CallHandlers | 其他处理程序 | 使用与处理程序一样的需求。 |
使用部分信任的限制
有一些关于如何与 Enterprise Library 应用程序块一起使用部分信任的限制,包括:
-
如果Enterprise Library 没有强制的权限,将抛出
SecurityException
。 -
某些对日志应用程序块跟踪监听器类的调用会失败。
-
ASP.NET 应用程序目录需要特殊的权限。
-
AzMan 提供程序在部分信任时不可用。
Enterprise Library 抛出安全异常
如果应用程序没有必要的权限而使用特殊的 Enterprise Library 特性,Enterprise Library 通常抛出一个
SecurityExcption
回应用程序。仅有在代码需要的权限对特性的操作来说不是严格要求的时才不会出现这种情况。例如,如果日志应用程序块不能调用提供当前进程信息的
API 时,这些信息将简单的不记录到日志信息中,而调用会成功。
日志应用程序块跟踪监听器的限制
创建一个事件日志和为磁盘文件创建一个目录都需要完全权限。因此,日志应用程序块监听程序运行在部分信任下时,如果它们试进行这些操作将失败。下列在日志应用程序块中的二个类将导致加载失败,即使在代码中没有使用它们,因为 Enterprise Library 会初始化并缓存它们:
- FormattedEventLogTraceListener
-
此类在它的构造函数中创建一个
EventLog
对象的实例。此调用在部分信任下将失败,如果跟踪监听器在应用程序配置已配置的话,它将防止应用程序块创建LogWriter
对象,即使在应用程序中没有使用FormattedEventLogTraceListener
类这也会发生。 - FormattedTextWriterTraceListener
-
此类在构造函数中检查指定的目录是否存在,如果不存在将创建它。然而,如果用于目标目录的带有适当权限的
FileIOPermission
类没有添加到定制策略文件中,它使用的Directory.Exists
方法在部分信任下将返回 false 。如果跟踪监听器在应用程序配置已配置的话,它将防止应用程序块创建LogWriter
对象,即使在应用程序中没有使用FormattedTextWriterTraceListener
类这也会发生。
对于所有其他配置在应用程序配置文件中的监听器,包括
TextWriterTraceListener
,只有在代码调用了监听器的
TraceData
方法时才失败。
ASP.NET 应用程序目录需要的权限
默认情况下,ASP.NET 在Windows 2000 和 Windows XP 中运行在 ASPNET
帐号,在 Windows Server 2003 中运行在 Network
Service 帐户下。如果指定了一个FileConfigurationSource
对象,而它放置在 ASP.NET
应用程序目录以外的一个目录中,应用程序运行的帐户必须有正确的权限,下列步骤描述了如何设置这些权限。
设置用于 ASP.NET 应用程序目录的权限
-
添加 FileIOPermission 类到策略文件的 <SecurityClasses> 元素中。
-
设置 Read 和 PathDiscovery 属性给在 Enterprise Library FileConfigurationSource 类中指定的文件。
-
设置 Read 和 Execute ACL 权限给在 FileConfigurationSource 类中指定的文件。
AzMan 提供程序不可用
AzMan 提供程序要求 Enterprise Library 是完全信任的。因为 Enterprise Library 不支持部分信任的调用信任的程序集,任何使用在 Enterprise Library 中的AzMan 提供程序的应用程序都必须是完全信任的。不能在部分信任安全级别下使用 AzMan 提供程序。