SharePoint 2007 - RunWithElevatedPrivileges - 使用此功能的缺陷

8

我有一种强烈的直觉,认为应该像避瘟疫一样避免使用SharePoint的RunWithElevatedPrivileges,但需要说服其他人确切地原因。以下是我的想法。

  • 使用提升的特权生成新线程
  • 阻塞其他操作,直到传递的委托返回
  • 安全问题(以高特权级别运行,可能由最终用户执行)
  • 其他问题?
4个回答

15

提升权限的原因可分为两类:

  1. 您的代码需要在SharePoint中执行操作,而当前用户没有权限。应该始终在使用SharePoint安全性时进行操作,而不是作为“以防万一”措施,这表明您需要更好地了解您的安全情况。
  2. 您的代码需要访问外部资源(服务器文件系统、数据库、文件共享等),该应用程序池标识具有访问权限,但当前用户没有权限。

对于前者,最好使用SPSite模拟。后者是我使用RWEP的唯一原因。

要澄清的是,RWEP不会生成新线程。而是使用Win32 API将当前线程的身份还原回进程身份(关闭模拟),以运行权限提升的代码,然后切换回模拟以代表当前用户继续工作。这有几个影响:

  1. RWEP如果线程未被模拟,则无效,在定时器作业、Visual Studio工作流、控制台应用程序和通过stsadm运行的代码(特性接收器)中也无法使用。
  2. 访问SharePoint(假设您在CodeToRunElevated中创建了一个新的SPSite)将使用应用程序池的权限(SHAREPOINT \ system)执行。此帐户将完全访问当前Web应用程序,但不应具有更改SPFarm属性或对SSP进行更改等操作的Farm级权限。
  3. 在CodeToRunElevated的执行边界上使用身份感知对象(如SPSite及其子项)可能会导致一些非常奇怪的行为和竞争条件。就所有方面而言,考虑到这是不支持的。

正如Alex所说,一个SPSite的子级会继承其权限,而SPSite的权限是在创建时设置的。因此,即使您在CodeToRunElevated中引用了SPContext.Current.Site,它仍将以当前用户的权限进行操作。相反,您需要在提升块内创建和使用一个新的SPSite。

总结一下:在SharePoint之外模拟应用程序池,需要使用RWEP(运行Web请求的特权);在SharePoint内模拟应用程序池,需要使用SPSite模拟。


好的回答。你能详细说明为什么在计时器作业中它是无用的吗? - Anders Rask
1
SharePoint Web应用程序使用模拟身份来作为已登录用户运行代码 - RWEP只是在线程上暂时关闭该模拟身份。如果代码一开始就没有使用模拟身份运行,例如计时器作业或控制台应用程序,则线程用户和进程用户(RWEP的“提升用户”)是相同的。 - dahlbyk

4

1) 大量使用RWEP是代码异味的一个很好指标。它很容易被滥用而导致严重的安全问题。许多开发人员不考虑用户可能会利用他们在“引擎盖下”间接获得的权力做什么。

举个例子:在使用RWEP之前调用ValidateFormDigest非常重要,以防止应用程序页面中的恶意请求


2) SPWeb和SPSite对象需要在RWEP的上下文中创建。对于初学者来说很容易忘记,从而导致很多挫败感。

这个限制也意味着所有的工作和由这些对象创建的任何对象都必须在RWEP委托结束之前使用和完成。这是另一个常见的错误。

Keith Dahlby编写了扩展方法来解决这些问题,提供更强大和可读性更高的代码。


"代码异味的良好指示" - 我喜欢这个。太糟糕了,鼻子不能也对此起作用。 ;) - Tom Resing

2

RWEP,像其他任何东西一样,都有优点和缺点。

如果您担心最终用户运行RWEP,那么您可能已经面临更大的问题,因为该代码已经安装在GAC上。

有时,您只需要坚持下去:考虑一个没有管理员权限的用户运行文档工作流程。 在此用户批准(或拒绝,无所谓)之后,您的工作流引擎应能够重新定义该SPListItem的特权。


避免使用RunWithElevatedPrivileges可能是另一个很好的理由。代码访问安全性。Ruben,你能确认GAC要求的来源吗? - Tom Resing

0

我使用它,并发现它具有非常有用的功能。在我看来,我选择让用户运行我的代码并使该代码执行用户通常无法执行的操作。您可以锁定某些内容,但仍以非常受控制的方式让用户访问它。


“做事情”非常宽泛。在访问SharePoint对象时,应该避免使用它。相反,遵循dahlbyk的建议,使用SPSite模拟可以消除RunWithElevatedPrivileges的复杂性。更多信息请参见:http://solutionizing.net/2009/01/06/elegant-spsite-elevation/ - Tom Resing

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接