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?的主要内容,如果未能解决你的问题,请参考以下文章

identity与ASP.NET 模拟

在我的 ASP.NET 应用程序中不断弹出模拟身份验证屏幕后

关于 web.config impersonate 帐号模拟

在标准 ASP.NET MVC 安装模板中模拟用户

是否可以通过 c# ASP.net Web 应用程序中的代码来模拟唯一用户的体验?

ASP.NET 2.0 中的模拟