沙盒解决方案的限制
本主题介绍在沙盒解决方案中运行的代码所受的限制。
上次修改时间: 2015年3月9日
适用范围: SharePoint Foundation 2010
本文内容
三重工作进程
用于沙盒工作进程的低特权安全令牌
用于沙盒工作进程的限制代码访问安全策略
Microsoft.SharePoint.dll 程序集的特殊版本
分页呈现系统
资源使用限制
相对于场的解决方案验证
相对于场的解决方案阻止
相对于场的类阻止
其他限制
各种限制通常可根据实施限制的机制分为以下类别。
三重工作进程
用于沙盒工作进程的低特权安全令牌
用于沙盒工作进程的限制代码访问安全策略
Microsoft.SharePoint.dll 程序集的特殊版本
分页呈现系统
资源使用限制
相对于场的解决方案验证
相对于场的解决方案阻止
相对于场的类阻止
其他限制
三重工作进程
如沙盒解决方案体系结构中所述,沙盒代码在独立于标准 Microsoft ASP.NET 工作进程的工作进程中运行,并调用第三个完全信任的代理进程。这一事实对沙盒解决方案施加一些限制,而不管沙盒工作进程的权限如何。
限制 |
含义和说明 |
---|---|
在 ASP.NET 工作进程中运行的 WebResources.axd 处理程序无法访问在沙盒工作进程的程序集中嵌入的资源。 |
沙盒解决方案中的程序集无法使用嵌入的资源。 |
用于沙盒工作进程的低特权安全令牌
为沙盒工作进程提供低特权安全令牌。(此令牌与用户安全令牌不同。)该令牌会施加以下限制。
限制 |
含义和说明 |
---|---|
进程中的代码无法对文件系统执行读取或写入操作(但它可以读取和执行全局程序集缓存中的程序集)。 |
1. 应用程序页面、移动网页和用户控件(.ascx 文件)无法在沙盒解决方案中部署。由于它们都包含用户控件,因此不能为可视 Web 部件。沙盒解决方案中也不能使用作为用户控件实现的委托控件。 但是,某些其他类型的文件可以部署到内容数据库中,因此可以包含在沙盒解决方案中。这些文件包括脚本文件、图像文件和程序集。(有关详细信息,请参阅How to: Create and Deploy a non-RESX Resources in a Sandboxed Solution和沙盒解决方案中的程序集部署在何处?) 备注 Microsoft Visual Studio扩展库(该链接可能指向英文页面)中有一个扩展,通过它可以向沙盒解决方案项目中添加可视 Web 部件。这样便可使用可视设计器,但用户控件(ASCX 文件)会随隐藏的代码一起编译到程序集中。它不随解决方案一起部署。因此,此扩展不会启用 ASCX 部署的优点。 2. 网站定义需要一个 WebTemp*.xml 文件,因此不能在沙盒解决方案中部署。但是,可以通过使用 WebTemplate 元素代替 WebTemp*.xml 文件在沙盒解决方案中部署自定义网站类型。有关详细信息,请参阅How to: Deploy a Web Template in a Sandboxed Solution。 3. 不能在沙盒解决方案中部署资源 (.resx) 文件,但可通过一些方法本地化沙盒解决方案,而不将资源文件部署到服务器文件系统。有关详细信息,请参阅沙盒解决方案的本地化。 4. Web.config 文件不能与沙盒解决方案一起部署,也不能修改。这一点同样适用于补充的 .config 文件。有关详细信息,请参阅How to: Create a Supplemental .config File。加上 SPWebConfigModification 类不可用(请参阅下文),这意味着不能在沙盒解决方案中修改 web.config 设置。 |
进程中的代码无法呼叫网络。 |
只有正在运行沙盒工作进程的服务器上提供的资源可供访问。例如,无法访问外部数据库。这意味着无法在沙盒解决方案中部署 BCS 模型。 |
进程中的代码无法向注册表写入内容。 |
|
进程中的代码无法调用未部署到全局程序集缓存中的任何程序集。(此规则的一个例外是作为沙盒解决方案的一部分部署的程序集。有关详细信息,请参阅沙盒解决方案中的程序集部署在何处?) |
在沙盒工作进程中运行的代码无法调用全局程序集缓存中未安装的 Microsoft SharePoint Foundation 和 SharePoint Server 程序集。例如,无法调用 Microsoft.SharePoint.UserCode.dll 程序集。 |
重要信息 |
---|
沙盒工作进程的安全令牌不适用于在 Microsoft.SharePoint.dll 中对 API 进行的调用,原因是这些 API 在完全信任的独立进程中运行。例如,沙盒工作进程的安全令牌阻止访问外部数据库这一事实不会阻止沙盒解决方案访问 SharePoint 网站中的外部列表。此事实也不会阻止访问标准 SharePoint 列表(当内容数据库所在的服务器与处理沙盒解决方案的服务器不同时)。有关详细信息,请参阅沙盒解决方案体系结构。 |
用于沙盒工作进程的限制代码访问安全策略
用于沙盒解决方案工作进程的代码访问安全 (CAS) 策略是在文件 %ProgramFiles%\Common Files\Microsoft Shared\web server extensions\14\CONFIG\wss_usercode.config 中定义的,可在位于 %ProgramFiles%\Common Files\Microsoft Shared\web server extensions\14\UserCode 的 web.config 文件中引用该策略。该策略只授予下表中的权限。
授予的权限 |
说明 |
---|---|
但是,并非对象模型中的每个类都可以从沙盒代码中使用。请参阅本主题后面的 Microsoft.SharePoint.dll 程序集的特殊版本部分。 |
|
最低权限级别允许执行资源,但不允许对资源进行读/写访问,也不授予对资源的其他任何权限。不允许调用非托管代码。 |
下表选择了 CAS 策略未授予的一些权限。
拒绝的权限 |
说明 |
||
---|---|---|---|
没有此权限,沙盒代码将无法对文件系统进行读/写访问。沙盒工作进程的安全令牌也拒绝同一权限。 |
|||
没有此权限,沙盒代码将无法访问 ASP.NET Reflection API,因此也无法访问托管代码中的非公共类和成员。 |
|||
没有此权限,沙盒代码将无法访问注册表。沙盒工作进程的安全令牌也拒绝同一权限。 |
|||
没有此权限,沙盒代码将无法访问非托管代码以及线程和应用程序域子系统。没有此权限,还会使恶意代码难以规避 CAS 策略的限制。 |
|||
没有此权限意味着沙盒解决方案中的代码无法访问 SharePoint 数据库。此规则的例外情况是,调用 Microsoft.SharePoint.dll 的代码可以访问数据库,前提是程序集的特殊版本允许该调用。有关这些特殊程序集及其所起作用的详细信息,请参阅本主题后面的 Microsoft.SharePoint.dll 程序集的特殊版本。
|
|||
有关 CAS 策略的详细信息,请参阅在 ASP.NET 中使用代码访问安全性、.NET Framework 2.0 安全指南(该链接可能指向英文页面)和代码访问安全性实务(该链接可能指向英文页面)。
重要信息 |
---|
沙盒工作进程的 CAS 策略不适用于在 Microsoft.SharePoint.dll 中对 API 进行的调用,原因是这些 API 在完全信任的独立进程中运行。例如,可从文件系统的资源文件中读取对 GetLocalizedString 的调用。有关详细信息,请参阅沙盒解决方案体系结构。 |
备注
CAS 策略将强命名的 Microsoft Office 程序集作为例外。为这些程序集授予完全信任。
不能调用没有 AllowPartiallyTrustedCallers 属性的程序集
向沙盒工作进程中的代码授予低于完全信任的权限的 CAS 策略会产生显著的负面影响(无论该策略的详细信息如何):受 CAS 策略控制的代码只能调用具有 AllowPartiallyTrustedCallersAttribute 的程序集。因此沙盒工作进程中的代码无法调用任何程序集,包括缺少此属性的 Microsoft .NET Framework、SharePoint Foundation 和 SharePoint Server 程序集。下表记录了此限制的一些含义。
没有 AllowPartiallyTrustedCallers 属性的程序集 |
含义和说明 |
---|---|
Microsoft.SharePoint.WorkflowActions |
由于编码工作流需要访问此程序集中的类,因此无法在沙盒解决方案中部署此类工作流。(在 Microsoft SharePoint Designer 中创建并且可能在 Visual Studio 中修改的"无代码"工作流可 在沙盒解决方案中部署。) |
有关可用和不可用的 .NET Framework 和 SharePoint 程序集的列表,请参阅沙盒解决方案中可用和不可用的 .NET 程序集和沙盒解决方案中可用和不可用的 SharePoint 程序集。
Microsoft.SharePoint.dll 程序集的特殊版本
如沙盒解决方案体系结构中所述,在沙盒工作进程的代码中对 Microsoft.SharePoint.dll 的调用会重定向到该程序集的特殊版本。与沙盒工作进程中的其他程序集相比,特殊版本在某些方面权限较低,而在其他方面则权限较高。
最重要的限制是,该特殊版本只包含标准程序集的一部分类和方法。当代码调用程序集的特殊版本中不包括的 API 时,将引发异常。下表记录了程序集的特殊版本中不包括的一些 API。有关包括 的类的完整列表,请参阅沙盒解决方案中可用的 Microsoft.SharePoint.dll API。
被阻止的 API |
含义和说明 |
---|---|
大多数 Microsoft.SharePoint.Administration 命名空间,包括 SPWebApplication 和 SPFarm 类。 |
1. 沙盒解决方案中的功能不能部署到"服务器场"或"WebApplication"范围。因此,只能部署到这些范围的功能类型根本无法在沙盒解决方案中部署。例如,业务数据连接模型便无法在沙盒解决方案中部署。 2. 在对象模型中的网站集级别之上几乎没有任何对象和资源可供沙盒解决方案使用。 3. 向 Web 应用程序注册的文档转换器不能在沙盒解决方案中注册。 |
Microsoft.SharePoint.WebControls 命名空间中的所有控件类。 |
沙盒解决方案中的代码仅限于 ASP.NET 控件。 |
沙盒代码不能包含 Web 部件移动适配器。 |
|
沙盒解决方案只能包含从 ASP.NET 类 System.Web.UI.WebControls.WebParts.WebPart 派生的 Web 部件。 |
|
沙盒解决方案中不能包括计时器作业。 |
|
不能以编程方式通过沙盒解决方案修改 web.config 设置。加上沙盒解决方案无法读取或写入服务器文件系统这一事实(请参阅上文),这意味着不能在沙盒解决方案中修改 web.config 设置。 |
|
不能将沙盒解决方案中的方法配置为用运行应用程序池所用用户标识的提升特权来运行。 |
此外,即使在程序集的特殊版本中包括某一方法,也会对传递给 API 的参数施加其他限制。例如,SPSite(String) 和 SPSite(Guid) 构造函数可供沙盒解决方案使用,但只会向其传递引用安装沙盒解决方案的网站集的 URL 或 GUID。这样可以防止沙盒解决方案访问安装它所在的网站集之外的任何网站、列表或其他资源。
但与对其他任何程序集的调用相比,特殊程序集网关守卫允许的对 Microsoft.SharePoint.dll 的调用在一个非常重要的方面权限更高:调用的 API 不在受限的沙盒工作进程中运行。实际上,调用会转发至可不受限制执行 API 的完全信任代理进程。这意味着此类调用可以执行访问 SharePoint 数据库等操作,调用其他任何程序集甚至其他 SharePoint 程序集都无法完成此类操作。
分页呈现系统
如沙盒解决方案体系结构中所述,当客户端计算机请求的 SharePoint 页包括来自沙盒解决方案的组件(如在沙盒解决方案中部署的 Web 部件)时,SharePoint 会呈现多个页对象。一个在 ASP.NET 工作进程 (w3wp.exe) 中呈现,其他的在沙盒工作进程中呈现。所有非沙盒组件都在 ASP.NET 工作进程的页中呈现,而第一个沙盒组件则在沙盒工作进程的页对象中呈现。当沙盒工作进程中的页完全呈现时,会将其合并到 ASP.NET 进程的页对象中。如果用户请求的页中有多个沙盒组件,则每个组件会在沙盒工作进程中自己的页对象中单独呈现。每个此类页对象又会合并到 ASP.NET 进程的页对象中。
此系统的一层含义是在沙盒解决方案中部署的 Web 部件既不能是 Web 部件连接中的提供程序,也不能是其中的使用者 Web 部件。这是因为每个沙盒 Web 部件都完全在自己的单独页对象中呈现。(使用派生自 Microsoft.SharePoint.WebPartPages.WebPart 类的 Web 部件时,跨页 Web 部件连接是可能实现的,但填充码 Microsoft.SharePoint.dll 会阻止该类 - 请参阅上文。只有派生自 System.Web.UI.WebControls.WebParts.WebPart 类的 Web 部件在沙盒解决方案中才受支持,并且这些 Web 部件不允许跨页 Web 部件连接。)
分页呈现系统还有另一层含义。有些 ASP.NET 类型无法从沙盒进程的一个页对象合并到返回的最终页中。这意味着,如果沙盒解决方案中的代码向 ASP.NET Page 对象或其子对象的属性(其中保存这些不可合并类型的对象)中写入内容,将毫无意义。下表列出了其中部分类型。
不可合并类型 |
含义和说明 |
---|---|
沙盒代码不应向 ClientScript 属性中写入内容。但是,可通过其他方式向页注册客户端脚本。例如,可将脚本嵌入为 LiteralControl 并在 CreateChildControls() 方法中将其添加到控件集合。 |
|
沙盒代码不应将 ScriptManager 对象添加到任何对象的控件集合。 |
|
沙盒代码不应向 Cache 属性中写入内容。 |
|
沙盒代码不应向 Master 属性中写入内容。但是,它可以通过向 MasterPageFile 属性中写入内容使页面指向不同母版页。 |
|
沙盒代码不应向 Session 属性中写入内容。 |
资源使用限制
沙盒解决方案不能使用过多的系统资源。此要求由 SharePoint Foundation 资源监视基础结构实施。
有关详细信息,请参阅SharePoint 2010 中沙盒解决方案的资源使用率限制和沙盒解决方案体系结构。
相对于场的解决方案验证
如Solution Validation System中所述,服务器场管理员会将自定义解决方案验证施加于沙盒解决方案。这可能会对沙盒解决方案可以执行的操作施加其他限制。必须向服务器场管理员了解他们所使用的验证程序。
相对于场的解决方案阻止
服务器场管理员可将任何沙盒解决方案置于管理中心的阻止解决方案列表中。
相对于场的类阻止
服务器场管理员可以运行自定义代码,该代码将阻止在沙盒工作进程中调用指定的托管类。有关详细信息,请参阅 SPRestrictedObjectModel。
其他限制
下表介绍了与本主题的其他部分不完全符合的针对沙盒解决方案的限制。
限制 |
说明和含义 |
---|---|
不能在沙盒解决方案中部署 HideCustomAction 元素。 |
不能使用沙盒解决方案隐藏管理页(如"网站设置"页)中的菜单项、功能区按钮或链接。但是,可以 使用沙盒解决方案向上述任何项中添加新的自定义操作。有关详细信息,请参阅可以在沙盒解决方案中实现哪些内容。 |
不能在沙盒解决方案中部署 CustomActionGroup 元素。 |
尽管可在沙盒解决方案中添加新的自定义操作,但不能为自定义操作创建新操作组。有关详细信息,请参阅可以在沙盒解决方案中实现哪些内容。 |
不能在沙盒解决方案中为委托控件(Control 元素)注册控件候选项。 |