В прошлом я довольно долго делал олицетворение в SharePoint, выполняя что-то вроде следующего.
SPWeb web = SPContext.Current.Web;
string currentWebUrl = web.Url;
SPUser user = web.EnsureUser(loginToImpersonate);
using (SPSite site = new SPSite(currentWebUrl, user.UserToken)
{
using (SPWeb impersonatedWeb = site.OpenWeb())
{
// Any SharePoint access here to 'impersonatedWeb'
// is impersonated as 'loginToImpersonate'
}
}
Обратите внимание, что для этого не требуется пароль пользователя, которого вы олицетворяете, но для его запуска требуется определенная защита доступа к коду. В качестве примечания, вызов EnsureUser также требует, чтобы текущий пользователь был администратором, но есть другие методы, которые могут использоваться вместо EnsureUser для получения объекта SPUser (пытаясь сохранить фрагмент моего кода простым для этого вопроса).
Теперь, когда я подготовил почву ... Теперь я хочу сделать FullTextSQLQuery или KeywordQuery для обработчика запросов MOSS или WSS и получить урезанные по безопасности результаты, основанные на подражаемом пользователе. Оба объекта могут использовать SPSite для конструктора, но игнорировать мою логику олицетворения. Вместо этого они идут с зарегистрированным пользователем (HTTPContext.Current.User).
Есть и другие конструкторы: имя приложения (строка), а для MOSS есть один с ServerContext для SSP, но я не думаю, что это поможет вообще.
Я использовал Reflector для класса KeywordQuery и его базового класса Query, и он становится довольно уродливым и быстрым. Я полагаю, что реальная логика, которая определяет пользователя, находится в неуправляемом коде.
Итак, могу ли я это сделать?