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

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

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


person Jim    schedule 27.01.2009    source источник


Ответы (4)


SPSecurity.RunWithElevatedPrivileges

person Nat    schedule 27.01.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
        }
    }
});
person Kirk Liemohn    schedule 08.04.2009

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

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

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

person AnthonyWJones    schedule 27.01.2009
comment
Не подходит для среды SharePoint - person Nat; 28.01.2009

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

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

person andrewbadera    schedule 07.04.2009