我有一种强烈的直觉,RunWithElevatedPrivileges
应该像瘟疫一样避免使用 SharePoint,但需要说服其他人确切原因。这就是我所拥有的。
- 产生一个具有提升权限的新线程
- 阻塞其他操作,直到传递的委托返回
- 安全问题(可能由最终用户以高级别的权限运行)
- 其他的?
我有一种强烈的直觉,RunWithElevatedPrivileges
应该像瘟疫一样避免使用 SharePoint,但需要说服其他人确切原因。这就是我所拥有的。
提升的原因分为两类:
对于前者,最好使用SPSite impersonation。后者是我使用 RWEP 的唯一原因。
澄清一下,RWEP 不会产生新线程。相反,它使用 Win32 API 将当前线程的身份恢复为进程身份(关闭模拟)以运行提升的代码,然后重新打开模拟以代表当前用户恢复工作。这有几个含义:
正如 Alex 所说,SPSite 的子级从 SPSite 继承其权限,而 SPSite 在创建时又设置了权限。因此,即使您在 CodeToRunElevated 中引用它,SPContext.Current.Site 仍将以当前用户的权限运行。相反,您需要在提升的块内创建和使用新的 SPSite。
总结一下:RWEP 模拟 SharePoint 外部的应用程序池,SPSite 模拟模拟 SharePoint 内部的应用程序池。
1) 大量使用 RWEP 是代码异味的一个很好的迹象。它很容易被滥用而不加考虑,从而导致严重的安全问题。许多开发人员没有考虑用户可以使用“幕后”间接获得的权力做什么。
仅举一个例子:在使用 RWEP 之前调用 ValidateFormDigest 很重要,以防止应用程序页面中的恶意请求。
2) SPWeb 和 SPSite 对象需要在 RWEP 的上下文中创建。这对于新手开发人员来说很容易忘记,从而导致很多挫败感。
此限制还意味着所有工作和由这些对象创建的任何对象都必须在 RWEP 委托结束之前使用和完成。这是另一个常见的错误。
Keith Dahlby 编写了扩展方法来解决这些问题,提供更健壮和可读的代码。
RWEP 和其他一切一样,有利也有弊。
如果您担心最终用户运行 RWEP,那么您可能已经遇到了更大的问题,因为该代码已经安装在 GAC 上。
有时,您只需要坚持下去:考虑一个没有管理员权限的用户,正在运行文档工作流程。在此用户批准(或拒绝,没关系)之后,您的工作流引擎应该能够重新定义该 SPListItem 权限。
我使用它,并发现它是非常有用的功能。在我看来,我选择让用户运行我的代码并让该代码执行用户通常无法执行的操作。您可以锁定某些内容,并且仍然让用户以非常可控的方式访问它。