ASP.NET 代码访问安全性
更新:2007 年 11 月
使用 ASP.NET 来承载多个网站的优点之一是在公共语言运行库 (CLR) 中支持代码访问安全性,有助于对服务器应用程序进行保护。根据关于代码来源的证据(例如程序集的强名称或代码的源 URL),代码被分配到安全区域分类中。
以完全信任模式运行的应用程序仍然可以使用执行该应用程序所用的 Windows 帐户(ASP.NET 进程标识)通过 NTFS 文件权限、数据库权限等进行约束。有关更多信息,请参见配置 ASP.NET 进程标识。
通常,通过使程序集具有强名称并为该程序集添加安全策略,可以为单个程序集配置代码访问安全性。但是,许多 ASP.NET 程序集是在编译页的过程中动态生成的,因此并未进行强命名,所以您必须间接地为这些程序集配置安全策略。此外,由于 ASP.NET 支持非编译应用程序,因此不支持基于程序集的证据。由于 ASP.NET 应用程序包含目录结构概念,因此与单独地手动配置 .NET Framework 分别处理计算机上的每个 ASP.NET 应用程序相比,根据 ASP.NET 应用程序的类别配置代码访问安全性要容易得多。
对于每个应用程序,ASP.NET 允许您分配一个与预定义的权限集对应的可配置信任级别。默认情况下,根据应用程序所呈现的证据为应用程序分配信任级别。若要使用低于 Full 级别的权限集运行 Web 应用程序,您必须使用在 ASP.NET 信任级别和策略文件中定义的一种预定义信任级别来强制不完全信任策略。
您可以在应用程序的 Web.config 文件中使用以下配置设置重写默认行为,并将应用程序和给定的安全策略关联起来:
<location path="SampleApp" allowOverride="false">
<trust level="High"
originUrl="https://www.contoso.com"/>
</location>
trust 配置元素可应用于计算机级别(在这种情况下,每个 ASP.NET 应用程序都在该信任级别运行),或应用于层次结构中的任何应用程序根目录(在这种情况下,信任级别应用于特定的 ASP.NET 应用程序)。若要为整个站点设置策略,可以通过编辑该站点的根应用程序的 Web.config 文件并指定站点的根目录作为路径位置来进行设置,如下面的示例所示:
<location path="ContosoSite" allowOverride="false">
<trust level="High"
originUrl="https://www.contoso.com"/>
</location>
对于受信任的站点,建议将 trust 配置元素的 level 属性设置为 High。对于不受信任的站点(如承载运行外部客户代码的站点的 Web 服务器),建议将 trust 配置元素的 level 属性设置为 Medium。有关以中等信任级别运行 ASP.NET 应用程序的详细说明,请参见位于 Patterns and Practices (PAG): Security Guidance for Applications(模式和做法 (PAG):应用程序安全指南)上的“How To: Use Medium Trust in ASP.NET 2.0”(如何:在 ASP.NET 2.0 中使用中等信任)。
若要在计算机或站点级别配置信任设置,通常在 location 元素中将 allowOverride 属性设置为 false,从而使各个应用程序无法指定自己的信任级别。通常在共享服务器安装中采用此设置。
下表列出了 trust 配置元素的默认受支持属性。
属性 |
说明 |
受支持的值 |
---|---|---|
level |
指定应用程序将在其中运行的安全区域。 |
Full、High、Medium、Low 和 Minimal。 |
originUrl |
指定允许使用 System.Net 命名空间中的类进行连接访问的 URL 或 URL 模式。如果存在该属性,可以使用该属性来检查某些允许连接到不同网络位置的对象(如 WebRequest 实例)的权限。例如,可以使用网络场中服务器的主机名配置此属性,以便 ASP.NET 页可以调用部署在 Web 应用程序所在的网络场中的 Web 服务。 |
格式正确的 HTTP URL,或 WebPermissionAttribute 支持的基于 regex 的语法。 |
下表列出了 CLR 支持的权限类型以及不同信任级别下各个权限的默认策略。
权限 |
完全 |
高 |
中 |
低 |
最低 |
---|---|---|---|---|---|
完全 |
高 |
中 |
低 |
最低 |
|
无限制 |
无限制 |
无权限 |
无权限 |
无权限 |
|
无限制 |
无限制 |
无限制 |
无权限 |
无权限 |
|
无限制 |
无限制 |
Read:TEMP、TMP、OS、USERNAME、COMPUTERNAME |
无权限 |
无权限 |
|
无限制 |
无限制 |
Read、Write、Append、PathDiscovery:应用程序目录 |
Read、PathDiscovery:应用程序目录 |
无权限 |
|
无限制 |
无限制 |
1 MB UserQuota(对于个别站点可能有所变化)、AssemblyIsolationByUser |
无权限 |
||
无限制 |
无权限 |
无权限 |
|||
无限制 |
无权限 |
无权限 |
无权限 |
||
无限制 |
无限制 |
无权限 |
无权限 |
无权限 |
|
无限制 |
Execution, Assertion, ControlPrincipal, ControlThread, RemotingConfiguration |
Execution, Assertion, ControlPrincipal, ControlThread, RemotingConfiguration |
|||
无限制 |
无权限 |
无权限 |
|||
无限制 |
无限制 |
无权限 |
无权限 |
无权限 |
|
无限制 |
无限制 |
Connect(对于原始主机,如果已配置) |
无权限 |
无权限 |
|
无限制 |
无限制 |
无限制 |
无权限 |
无权限 |
|
事件日志 |
无限制 |
无权限 |
无权限 |
无权限 |
无权限 |
消息队列 |
无限制 |
无权限 |
无权限 |
无权限 |
无权限 |
服务控制器 |
无限制 |
无权限 |
无权限 |
无权限 |
无权限 |
性能计数器 |
无限制 |
无权限 |
无权限 |
无权限 |
无权限 |
目录服务 |
无限制 |
无权限 |
无权限 |
无权限 |
无权限 |
当某个权限级别可用但未在安全策略中显式指定时,使用 Full 权限运行的应用程序可以始终使用该权限级别。对于使用较低信任级别运行的应用程序,除非通过修改安全策略显式授予它们相应的权限,否则这些应用程序将无法使用资源。
如表所示,使用 High 权限集的应用程序对其应用程序目录中的文件具有读/写权限,而 Low 信任应用程序对于其应用程序目录中的文件具有只读权限。因为 FileIOPermission 类型依赖于物理路径(例如 c:\SampleAppPath),所以 ASP.NET 在策略文件中使用标记化的语句,这些标记化的语句在运行时由应用程序的相关路径信息来替换。
使用诸如 System.Net.WebRequest 等类,WebPermission 类型允许应用程序连接到由原始主机属性定义的网络位置。在 ASP.NET 中,可以通过在给定应用程序的 trust 节中提供可选的 originUrl 属性,来配置此权限。originUrl 属性将替换策略文件中的 $OriginHost$ 变量,如 Web_hightrust.config 文件的以下节中所示:
<IPermission class="WebPermission" version="1">
<ConnectAccess>
<URI uri="$OriginHost$"/>
</ConnectAccess>
</IPermission>