【问题标题】:ASP.NET - temporarily impersonate the app pool service ID when default it to impersonate the user?ASP.NET - 在默认模拟用户时临时模拟应用程序池服务 ID?
【发布时间】:2009-01-27 20:45:49
【问题描述】:

我必须调用 SharePoint 网站中的一些代码,这些代码在运行 Web 应用程序的同一服务 ID 下运行。默认情况下,SharePoint 会模拟查看网页的用户,而用户没有必要的权限。

使用 Web 应用程序的服务 ID 运行某些代码然后恢复使用默认模拟的最佳方法是什么?

【问题讨论】:

    标签: asp.net sharepoint impersonation


    【解决方案1】:
    【解决方案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

      【讨论】:

        猜你喜欢
        • 2013-10-03
        • 1970-01-01
        • 2017-10-19
        • 1970-01-01
        • 2013-03-20
        • 2019-06-19
        • 2011-08-15
        • 1970-01-01
        • 2012-09-04
        相关资源
        最近更新 更多