我有一种强烈的直觉,即应该像瘟疫一样避免使用SharePoint RunWithElevatedPrivileges
,但需要让其他人相信其确切原因。这就是我所拥有的。
答案 0 :(得分:15)
将跌倒分为两类的原因:
对于前者,使用SPSite impersonation会更好。后者是我使用RWEP的唯一原因。
为了澄清,RWEP不会产生新的线程。相反,它使用Win32 API将当前线程的标识恢复为进程标识(关闭模拟)以运行提升的代码,然后重新开启模拟以代表当前用户恢复工作。这有几个含义:
正如亚历克斯所说,SPSite的子级继承了SPSite的权限,而SPSite在创建时又设置了权限。因此,即使您在CodeToRunElevated中引用它,SPContext.Current.Site仍将使用当前用户的权限。相反,您需要在提升的块中创建和使用新的SPSite。
总结:RWEP模拟SharePoint之外的应用程序池,SPSite模拟模拟SharePoint内部的应用程序池。
答案 1 :(得分:4)
1)大量使用RWEP是代码异味的良好指示。它可以很容易地被滥用,而不会导致严重的安全问题。许多开发人员并没有考虑用户可以做什么,他们间接地在“引擎盖下”给予他们权力。
仅举一个例子:在将RWEP用于prevent malicious requests in application pages之前调用ValidateFormDigest非常重要。
2)需要在RWEP的上下文中创建SPWeb和SPSite对象。这对新手开发人员来说很容易忘记,导致很多挫折。
此限制还意味着必须在RWEP委托结束之前使用和完成由这些对象创建的所有工作和任何对象。这是另一个常见的错误。
Keith Dahlby编写extension methods来解决这些问题,提供更强大,更易读的代码。
答案 2 :(得分:2)
如果您担心最终用户正在运行RWEP,可能您已经遇到了更大的问题,因为该代码已经安装在GAC上。
有时,您只需要坚持下去:考虑一个没有管理员权限的用户,运行文档工作流程。在此用户批准(或拒绝,无关紧要)之后,您的工作流引擎应该能够重新定义该SPListItem权限。
答案 3 :(得分:0)
我使用它,并发现它是非常有用的功能。在我看来,我选择让用户运行我的代码并让代码执行用户通常无法做的事情。您可以锁定某些内容,并且仍然允许用户以非常受控的方式访问它。