【发布时间】:2009-01-27 20:45:49
【问题描述】:
我必须调用 SharePoint 网站中的一些代码,这些代码在运行 Web 应用程序的同一服务 ID 下运行。默认情况下,SharePoint 会模拟查看网页的用户,而用户没有必要的权限。
使用 Web 应用程序的服务 ID 运行某些代码然后恢复使用默认模拟的最佳方法是什么?
【问题讨论】:
标签: asp.net sharepoint impersonation
我必须调用 SharePoint 网站中的一些代码,这些代码在运行 Web 应用程序的同一服务 ID 下运行。默认情况下,SharePoint 会模拟查看网页的用户,而用户没有必要的权限。
使用 Web 应用程序的服务 ID 运行某些代码然后恢复使用默认模拟的最佳方法是什么?
【问题讨论】:
标签: asp.net sharepoint impersonation
纳特是对的。您应该使用 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
【讨论】: