asp.net - SharePoint 2007 - RunWithElevatedPrivileges - 使用它的陷阱

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

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

  • 产生一个具有提升权限的新线程
  • 阻止其他操作,直到传递的委托(delegate)返回
  • 安全问题(以高级别的权限运行,可能由最终用户)
  • 其他的?
  • 最佳答案

    提升的原因分为两类:

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

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

    澄清一下,RWEP 不会产生新线程。相反,它使用 Win32 API 将当前线程的身份恢复为进程身份(关闭模拟)以运行提升的代码,然后重新打开模拟以代表当前用户恢复工作。这有几个含义:
  • 如果线程没有被模拟,RWEP 什么都不做,因此它在计时器作业、Visual Studio 工作流、控制台应用程序和通过 stsadm(功能接收器)运行的代码中毫无用处。
  • 假设您在 CodeToRunElevated 中创建了一个新的 SPSite,将使用应用程序池 (SHAREPOINT\system) 的权限访问 SharePoint。此帐户将拥有对当前 Web 应用程序的完全访问权限,但不应拥有服务器场级别的权限来执行修改 SPFarm 属性或更改 SSP 等操作。
  • 在 CodeToRunElevated 的执行边界上使用身份感知对象(如 SPSite 及其子对象)可能会导致一些非常时髦的行为和竞争条件。出于所有意图和目的,认为这是不受支持的。

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

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

    关于asp.net - SharePoint 2007 - RunWithElevatedPrivileges - 使用它的陷阱,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1525953/

    相关文章:

    sharepoint - 使用 PowerShell 在 SharePoint 中检索已部署解决方案的详细信息

    asp.net - 连接到 AS400 时如何在 ASP.Net MVC 上设置动态连接字符串用户名和密码

    asp.net - 与 Windows 类似的 Web 应用程序外观

    c# - ASP.NET 5/MVC 6 控制台托管应用程序

    asp.net - 具有灵活高度的Gridview

    sharepoint - 使用 Powershell 脚本访问 Sharepoint 用户配置文件属性

    SharePoint - 以编程方式添加列表项并设置 ID

    jquery - 使用 SharePoint 功能或物理文件部署 jQuery?

    c# - Web 服务集用户许可证 Office 365

    选择字段上的 Sharepoint LookUp 字段?