我必须调用 SharePoint 站点中的一些代码,这些代码在运行 Web 应用程序的同一服务 ID 下运行。默认情况下,SharePoint 会模拟查看网页的用户,而用户没有必要的权限。
使用 Web 应用程序的服务 ID 运行一些代码,然后恢复使用默认模拟的最佳方式是什么?
我必须调用 SharePoint 站点中的一些代码,这些代码在运行 Web 应用程序的同一服务 ID 下运行。默认情况下,SharePoint 会模拟查看网页的用户,而用户没有必要的权限。
使用 Web 应用程序的服务 ID 运行一些代码,然后恢复使用默认模拟的最佳方式是什么?
纳特是对的。您应该使用 SPSecurity.RunWithElevatedPrivileges。在幕后,它执行了 Anthony 提到的 ReverToSelf,但使用辅助方法要容易得多。您可以使用内联委托,如下例所示。
要实现的主要事情是这个委托在一个单独的应用程序域下运行,这基本上意味着您想要使用 SPSite 或 SPWeb,您必须在委托中重新实例化它们,如下所示。
SPSecurity.RunWithElevatedPrivileges(delegate()
{
// Your are now inside the delegate
// Anything provided within this block is marshaled across the app domain
using (SPSite site = new SPSite("http://myserver/sites/mysite"))
{
using (SPWeb web= site.OpenWeb())
{
// Do stuff here
}
}
});
在 ASP 下,我有一个实用程序 DLL,我可以使用它来调用 Win32 的 RevertToSelf() 函数(在 advapi32.dll 中找到),以使 ASP 在应用程序池的标识下运行。
当然,一旦到达那里,就无法回到线程使用的原始身份,但这并不是真正的问题。当前请求结束后,下一个请求将以用户身份(或匿名用户)再次运行。
您可能可以对 ASP.NET 中的 PInvoke 执行相同的操作,但我不知道这可能对框架产生什么影响。我敢肯定它只会持续到当前的请求。我认为没有任何标准的.NET API 可以做到这一点。
简单的!将您正在进行的调用包装在 HostingEnvironment.Impersonate() 块中。
http://msdn.microsoft.com/en-us/library/system.web.hosting.hostingenvironment.impersonate.aspx