RunWithElevatedPrivileges : Attention au piége de l'impersonnation
Un petit piége qui n'as l'air de rien mais qui peut vous bloquer bien des heures.
Le principe de l'impersonnation est assez simple
>>> Vous exécutez une partie de votre processus sous une identité tierce, souvent un role à pouvoir genre owner/power users (ou pire ... admin)
Simple me dirait vous ? Et encore plus sous SharePoint grace à la méthode : SPSecurity.RunWithElevatedPrivileges.
Et la : ATTENTION AU PIEGE
En effet, la plupart des développeurs SharePoint affectionnent grandement l'objet SPWeb, et de toute maniére, il est difficilement contournable dans le contexte d'un site SP non ?
Le piége est la :
SPSecurity.RunWithElevatedPrivileges(delegate(){
SPWeb web = SPContext.Current.Web;
...
...
});
Dans ce cas, l'impersonnation ne joue pas !!!
>>> Celui ci est créé directement selon le contexte de l'utilisateur en cours et non la zone impersonnée, soit l'identité du pool applicatif.
Pour être sur d'utiliser le bon contexte de sécurité avec le SPWeb, vous devez absolument le créer de toute piéce dans le dit contexte.
Et non devoir le référencer
Puis surtout ensuite, le supprimer bien sur.
Il y a plusieurs méthodes :
Mais j'ai une préférence pour celle ci :
Guid webGuid = SPContext.Current.Web.ID;
Guid siteGuid = SPContext.Current.Site.ID;
SPSecurity.RunWithElevatedPrivileges(delegate()
{
// get the site in impersonated context
using (SPSite site = new SPSite(siteGuid))
{
// get the web in the impersonated context
SPWeb web = site.OpenWeb(webGuid);
// Do your work here
web.Dispose();
}
});
Tout est clair et explicite, pas de doute ni de gestion d'url.
Voila, maintenant, votre Code est désormais "application pool" powered !
>>> Faites bien attention quand même 
Renaud Comte aka TheMit (SPprison Break?)
Member of WygTeam
http://www.wygwam.com
Ce post vous a plu ? Ajoutez le dans vos favoris pour ne pas perdre de temps à le retrouver le jour où vous en aurez besoin :