ASP.NET - временно олицетворять идентификатор службы пула приложений, когда по умолчанию он олицетворяет пользователя? - PullRequest
2 голосов
/ 27 января 2009

Мне нужно вызвать некоторый код на сайте SharePoint, который работает под тем же идентификатором службы, под которым работает веб-приложение. По умолчанию SharePoint олицетворяет пользователя, просматривающего веб-страницу, и у пользователей нет необходимых разрешений.

Каков наилучший способ выполнить некоторый код с использованием идентификатора службы веб-приложения, а затем вернуться к использованию олицетворения по умолчанию?

Ответы [ 4 ]

4 голосов
/ 27 января 2009
3 голосов
/ 08 апреля 2009

Нат прав. Вы должны использовать SPSecurity.RunWithElevatedPrivileges. Под прикрытием он делает 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
        }
    }
});
0 голосов
/ 08 апреля 2009

легко! Оберните звонки, которые вы делаете, в блок HostingEnvironment.Impersonate ().

http://msdn.microsoft.com/en-us/library/system.web.hosting.hostingenvironment.impersonate.aspx

0 голосов
/ 28 января 2009

Под ASP у меня была служебная DLL, которую я мог использовать для вызова функции RevertToSelf () Win32 (находится в advapi32.dll), чтобы заставить ASP работать под идентификатором пула приложений.

Конечно, когда-то нет возврата к исходной идентичности, которую использовал поток, но на самом деле это не проблема. Как только текущий запрос завершится, следующий запрос будет выполнен снова под именем пользователя (или анонимными пользователями).

Возможно, вы могли бы сделать то же самое с PInvoke в ASP.NET, но я не знаю, как это может повлиять на фреймворк. Я уверен, что это будет продолжаться только для текущего запроса. Я не думаю, что есть какой-либо стандартный .NET API для этого.

...