J'ai fait l'impersonnalisation dans SharePoint assez souvent dans le passé en faisant quelque chose comme ce qui suit.
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'
}
}
Notez que cette opération ne nécessite pas le mot de passe de l'utilisateur dont vous vous faites passer pour un autre, mais qu'elle requiert une certaine sécurité d'accès au code pour être exécutée. Par ailleurs, l'appel à EnsureUser nécessite également que l'utilisateur actuel soit un administrateur, mais il existe d'autres méthodes qui peuvent être utilisées à la place de EnsureUser pour obtenir l'objet SPUser (j'essaie de garder mon fragment de code simple pour cette question).
Maintenant que j'ai préparé le terrain... Je veux maintenant faire une FullTextSQLQuery ou une KeywordQuery contre le moteur de requête de MOSS ou WSS et obtenir des résultats triés par sécurité basés sur un utilisateur usurpé. Les deux objets peuvent prendre un SPSite dans le constructeur, mais ignorent ma logique d'usurpation d'identité. Ils utilisent l'utilisateur actuellement connecté à la place (HTTPContext.Current.User).
Il y a aussi d'autres constructeurs : nom de l'application (chaîne) et pour MOSS, il y en a un avec un ServerContext vers le SSP, mais je ne pense pas qu'ils soient d'une quelconque utilité.
J'ai utilisé Reflector sur la classe KeywordQuery et sa classe de base Query et cela devient vite assez moche. Je crois que la logique réelle qui détermine l'utilisateur se trouve dans le code non géré.
Alors, est-ce que c'est possible pour moi de faire ça ?