ASP.NET - 在默认模拟用户时临时模拟应用程序池服务 ID?
Posted
技术标签:
【中文标题】ASP.NET - 在默认模拟用户时临时模拟应用程序池服务 ID?【英文标题】:ASP.NET - temporarily impersonate the app pool service ID when default it to impersonate the user? 【发布时间】:2009-01-27 20:45:49 【问题描述】:我必须调用 SharePoint 网站中的一些代码,这些代码在运行 Web 应用程序的同一服务 ID 下运行。默认情况下,SharePoint 会模拟查看网页的用户,而用户没有必要的权限。
使用 Web 应用程序的服务 ID 运行某些代码然后恢复使用默认模拟的最佳方法是什么?
【问题讨论】:
【参考方案1】:SPSecurity.RunWithElevatedPrivileges
【讨论】:
【参考方案2】:纳特是对的。您应该使用 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
);
【讨论】:
【参考方案3】:在 ASP 下,我有一个实用程序 DLL,我可以使用它来调用 Win32 的 RevertToSelf() 函数(在 advapi32.dll 中找到)以使 ASP 在应用程序池的标识下运行。
当然,一旦到了那里,就无法回到线程使用的原始身份,但这并不是真正的问题。当前请求结束后,下一个请求将以用户身份(或匿名用户)再次运行。
您可能可以在 ASP.NET 中对 PInvoke 执行相同的操作,但我不知道这可能会对框架产生什么影响。我敢肯定它只会持续到当前的请求。我认为没有任何标准的.NET API 可以做到这一点。
【讨论】:
不适合 SharePoint 环境【参考方案4】:简单!将您正在进行的调用封装在 HostingEnvironment.Impersonate() 块中。
http://msdn.microsoft.com/en-us/library/system.web.hosting.hostingenvironment.impersonate.aspx
【讨论】:
以上是关于ASP.NET - 在默认模拟用户时临时模拟应用程序池服务 ID?的主要内容,如果未能解决你的问题,请参考以下文章
在我的 ASP.NET 应用程序中不断弹出模拟身份验证屏幕后
关于 web.config impersonate 帐号模拟