【问题标题】:SharePoint 2007 - RunWithElevatedPrivileges - Pitfalls of using thisSharePoint 2007 - RunWithElevatedPrivileges - 使用它的陷阱
【发布时间】:2010-12-04 07:12:48
【问题描述】:

我有一种强烈的直觉,应该像避免瘟疫一样避免使用 SharePoint RunWithElevatedPrivileges,但需要说服其他人确切原因。这就是我所拥有的。

  • 使用提升的权限生成一个新线程
  • 在传递的委托返回之前阻止其他操作
  • 安全问题(以高级别的权限运行,可能由最终用户执行)
  • 其他?

【问题讨论】:

    标签: asp.net sharepoint sharepoint-2007 asp.net-3.5 elevated-privileges


    【解决方案1】:

    RWEP 和其他一切一样,有利有弊。

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

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

    【讨论】:

    • 可能是避免 RunWithElevatedPrivileges 的另一个好理由。代码访问安全。 Ruben,您能否确认 GAC 要求的来源?
    【解决方案2】:

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

    【讨论】:

    【解决方案3】:

    1) 大量使用 RWEP 是代码异味的一个很好的迹象。 它很容易被滥用而导致严重的安全问题。许多开发人员没有考虑用户可以利用“幕后”间接获得的权力来做什么。

    仅举一个例子:在使用 RWEP 到 prevent malicious requests in application pages 之前调用 ValidateFormDigest 很重要。


    2) SPWeb 和 SPSite 对象需要在 RWEP 的上下文中创建。这对于新手开发者来说很容易忘记,从而导致很多挫折。

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

    Keith Dahlby 编写了 extension methods 来解决这些问题,提供更健壮和可读的代码。

    【讨论】:

    • “代码气味的良好指示” - 我喜欢这样。太糟糕的鼻子也不起作用。 ;)
    【解决方案4】:

    提升的原因分为两类:

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

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

    澄清一下,RWEP 不会产生新线程。相反,它使用 Win32 API 将当前线程的身份恢复为进程身份(关闭模拟)以运行提升的代码,然后重新打开模拟以代表当前用户恢复工作。这有几个含义:

    1. 如果线程没有被模拟,RWEP 不会执行任何操作,因此它在计时器作业、Visual Studio 工作流、控制台应用程序和通过 stsadm(功能接收器)运行的代码中毫无用处。
    2. 假设您在 CodeToRunElevated 中创建一个新的 SPSite,将使用应用程序池 (SHAREPOINT\system) 的权限执行对 SharePoint 的访问。此帐户将拥有对当前网络应用程序的完全访问权限,但不应拥有服务器场级别的权限来执行修改 SPFarm 属性或更改 SSP 等操作。
    3. 在 CodeToRunElevated 的执行边界上使用身份感知对象(如 SPSite 及其子对象)可能会导致一些非常奇怪的行为和竞争条件。出于所有意图和目的,请认为这是不受支持的。

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

    总结一下:RWEP 模拟 SharePoint 外部的应用程序池,SPSite 模拟模拟 SharePoint 内部的应用程序池。

    【讨论】:

    • 好答案。你能详细说明为什么它在计时器作业等中没有用吗?
    • SharePoint Web 应用程序使用模拟来以登录用户的身份运行代码 - RWEP 只是暂时关闭线程上的模拟。如果代码不是以模拟开始运行的,例如在计时器作业或控制台应用程序中,那么线程用户和进程用户(RWEP 的“提升用户”)是相同的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多