使用 ASP.NET 主控多个站点的一个主要好处是公共语言运行库对于代码访问安全的支持,这样可以为服务器应用程序提供执行平台。系统根据代码的来源证据(例如,具有强名称的程序集或者来源的 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。 |
在默认情况下,与各种安全级别相关的策略享有下表所示的权限。
级别 | |||||
---|---|---|---|---|---|
权限 | Full | High | Medium | Low | Minimal |
AspNetHostingPermission | Full | High | Medium | Low | Minimal |
环境 | 未 | 未 | 读取:TEMP、TMP、OS、USERNAME、COMPUTERNAME | ||
FileIO | 未 | 未 | 读取、写入、追加和查找路径:应用程序目录 | 读取、查找路径:应用程序目录 | |
IsolatedStorage | 未 | 未 | AssemblyIsolationByUser, 未限制的 UserQuota | 1 兆配额(可以为单个站点改变),AssemblyIsolationByUser | |
反射 | 未 | ReflectionEmit | |||
注册表 | 未 | ||||
安全 | 未 | 执行、断言、ControlPrincipal、ControlThread、RemotingConfiguration | 执行、断言、ControlPrincipal、ControlThread、RemotingConfiguration | 执行 | 执行 |
套接字 | 未 | 未 | |||
WebPermission | 未 | 未 | 连接到原始主机(如果已配置)。 | ||
DNS | 未 | 未 | 未 | ||
打印 | 未 | 默认打印 | 默认打印 | ||
OleDBPermission | 未 | ||||
SqlClientPermission | 未 | 未 | AllowBlankPassword=false | ||
EventLog | 未 | ||||
消息 队列 |
未 | ||||
服务 控制器 |
未 | ||||
性能 计数器 |
未 | ||||
目录 服务 |
未 |
未 = 未限制的
空白 = 无权限
当某个权限级别可用但并未在安全策略中明确提出时,以 Full 信任级别运行的应用程序将可以使用该级别(因为它们设置了 Full 信任权限集)。以较低的信任级别运行的应用程序不能使用受非显式许可保护的资源,除非您专门更改策略来允许这样做。
如该表所示,High 信任级别的应用程序拥有对应用程序目录中的文件的读取/写入权限,而 Low 信任级别的应用程序仅对应用程序目录中的文件有只读权限。因为 FileIO 权限依赖于物理路径(如 c:\MyAppPath
),所以 ASP.NET 在策略文件中使用标记化的语句,该语句在运行时会由相关的路径信息替代。
请注意,WebPermission 允许应用程序连接到原始主机。通过在 <trust> 节上为给定的应用程序提供可选的 OriginUrl 属性,该机制可通过 ASP.NET 起作用。正如下面的 Web_hightrust.config 中的代码所示,OriginUrl 属性可用于替换策略文件中的
$OriginHost$ 变量。
<IPermission class="WebPermission" version="1">
<ConnectAccess>
<URI uri="$OriginHost$"/>
</ConnectAccess>
</IPermission>
SocketPermission 接受主机名或用点分隔的 IP 字符串(也许带有通配符),而 WebPermission 则接受包含协议的正则表达式(如 http://backendmachine/.*
)。如果要对此进行更改,您可以更改策略文件以使用所需的权限(或者通过复制默认值创建新的策略文件)。例如,您可以从 ASP.NET 命名权限集中变更 SocketPermission 节,以便允许在 8080 端口上通过 TCP 套接字连接到“backend1”和“backend2”,方法如下。
<IPermission class="SocketPermission" version="1">
<ConnectAccess>
<ENDPOINT host="backend1" transport="Tcp" port="8080"/>
<ENDPOINT host="backend2" transport="Tcp" port="8080"/>
</ConnectAccess>
</IPermission>