ASP.NET 代码访问安全性
使用 ASP.NET 来承载多个 Web 站点的一个主要优点是:公共语言运行库支持代码访问安全,可帮助保护服务器应用程序的安全。根据关于代码来源的证据(例如带有强名称的程序集或源的 URL 等证据),代码被分配到安全区域分类中。如果不能为安装在公共服务器上的各个互不相关的应用程序配置安全机制,那么 ASP.NET 页中属于一个应用程序的代码将能够读取另一个应用程序中的文件(例如 Web.config 文件)。以完全信任方式运行的应用程序只受操作系统帐户的限制,这些应用程序在该帐户下执行。
通过对程序集进行强命名并为该程序集添加策略,可以方便地为个别程序集处理代码访问安全性。但是,作为动态页编译的结果,将动态生成许多 ASP.NET 程序集,因此这些程序集未进行强命名,所以需要附加功能。
ASP.NET 允许您向应用程序分配对应于一组预定义权限的可配置信任级别。默认情况下(除非显式更改配置),应用程序将接收到与它们提供的证据相称的信任级别。例如,本地应用程序必须在 MyComputer 区域中使用 Full 信任权限集运行,位于通用命名规则 (UNC) 共享上的应用程序必须在 Intranet 区域中使用 LocalIntranet 限制权限集运行。如果要使用低于 Full 信任的级别运行 Web 应用程序,则您必须使用 ASP.NET 信任级别和策略文件中定义的某个预定义信任级别来实施部分信任策略。
您可以使用以下配置设置重写默认行为并将应用程序和给定的安全策略关联起来。
<location path="MyApp" allowOverride="false"> <trust level="High" originUrl="http://www.contoso.com"/> </location>
<trust> 配置标记可应用于计算机级别或层次结构中的任何应用程序根目录。
如果要为整个站点设置策略,您可以通过将站点的根目录指定为路径位置完成该操作,如下所示。
<location path="ContosoSite" allowOverride="false"> <trust level="High" originUrl="http://www.contoso.com"/> </location>
如果不想让应用程序能够指定它们自己的信任级别(多数共享服务器安装中是这种情况),则在使用 allowOverride 属性指定 <location> 指令时应小心。
下表列出了 <trust> 元素默认支持的属性。
属性 | 说明 | 默认支持的值 |
---|---|---|
level | 指定应用程序将在其中运行的安全区域。 | Full、High、Medium、Low 和 Minimal。 |
originUrl | 允许管理员设置应用程序的源的 URL。
这允许依赖于宿主概念的权限正常工作 |
格式正确的 HTTP URL。 |
默认情况下,向与不同的安全级别关联的策略授予的权限显示在下表中。
级别 | |||||
---|---|---|---|---|---|
权限 | 完全 | 高 | 中 | 低 | 最小 |
AspNetHostingPermission | 完全 | 高 | 中 | 低 | 最小 |
Environment | Un | Un | 读:TEMP、TMP、OS、USERNAME、COMPUTERNAME | ||
FileIO | Un | Un | 读、写、追加、路径发现:应用程序目录 | 读、路径发现:应用程序目录 | |
IsolatedStorage | Un | Un | AssemblyIsolationByUser、不受限制的用户配额 | 1 MB 配额(对于个别站点可能有所变化)、AssemblyIsolationByUser | |
Reflection | Un | ReflectionEmit | |||
Registry | Un | ||||
Security | Un | 执行、断言、控制主体、控制线程、远程处理配置 | 执行、断言、控制主体、控制线程、远程处理配置 | 执行 | 执行 |
Socket | Un | Un | |||
WebPermission | Un | Un | 连接到原始主机(如果已配置) | ||
DNS | Un | Un | Un | ||
Printing | Un | 默认打印 | 默认打印 | ||
OleDBPermission | Un | ||||
SqlClientPermission | Un | Un | AllowBlankPassword=false | ||
EventLog | Un | ||||
Message Queue |
Un | ||||
Service Controller |
Un | ||||
Performance Counters |
Un | ||||
Directory Service |
Un |
Un = 无限制的
空白 = 无权限
如果某个权限级别可用但未在安全策略中明确提出,则使用 Full 信任级别运行的应用程序可以使用它(因为它们具有 Full 信任权限集)。使用较低信任级别运行的应用程序将不能使用被非显式权限保护的资源,除非您明确更改策略允许它使用。
如该表所示,High 信任应用程序对位于其应用程序目录中的文件具有读/写权限,而 Low 信任应用程序对位于其应用程序目录中的文件具有只读权限。因为 FileIO 权限依赖于物理路径(例如 c:\MyAppPath
),所以 ASP.NET 在策略文件中使用标记化的语句,这些标记化的语句在运行时被应用程序的相关路径信息替换。
请注意,WebPermission 允许应用程序连接到原始主机。该机制通过在给定应用程序的 <trust> 部分提供可选的 OriginUrl 属性在 ASP.NET 中工作。OriginUrl 属性用于替换策略文件中的
$OriginHost$ 变量,如 Web_hightrust.config 中的以下代码所示。
<IPermission class="WebPermission" version="1"> <ConnectAccess> <URI uri="$OriginHost$"/> </ConnectAccess> </IPermission>
SocketPermission 获取主机名或以点分隔的 IP 字符串(可能带有通配符),WebPermission 获取包括协议的正则表达式(例如 http://backendmachine/.*
)。如果要对此进行更改,您可以使用所需的权限更改策略文件(或通过复制默认设置创建新的策略文件)。例如,您可以从 ASP.NET 命名权限集更改 SocketPermission 部分,以向端口 8080 上的“backend1”和“backend2”授予 TCP 套接字连接,如下所示。
<IPermission class="SocketPermission" version="1"> <ConnectAccess> <ENDPOINT host="backend1" transport="Tcp" port="8080"/> <ENDPOINT host="backend2" transport="Tcp" port="8080"/> </ConnectAccess> </IPermission>
出处:MSDN
posted on 2006-05-29 20:46 Daniel Pang 阅读(1301) 评论(0) 编辑 收藏 举报