Astuce du jour : impersonation et SharePoint

Vous avez peut-être déjà utilisé le code suivant pour exécuter du code avec des permissions élevées : 

SPSecurity.RunWithElevatedPrivileges(delegate
{
    using (SPSite site = new SPSite("http://sitecolurl"))
    {
        using (SPWeb web = site.RootWeb)
        {
            // Code nécessitant des droits élevés
        }
    }
}
);

Ceci permet de passer outre la sécurité du compte courant et ainsi pouvoir exécuter du code requérant normalement plus de droits. C'est déjà une bonne chose, et répond à certains problématiques (plus d'infos sur le MSDN). Pensez aussi à bien instancier un nouvel objet SPSite (voire SPWeb) et non en passant par le SPContext car ce dernier aura déjà chargé le nécessaire en utilisant le compte original. Attention : gardez en tête qu'étant donné ce mode d'exécution, vous devez d'autant plus être vigilant sur les données remontées et les actions effectuées : ne créez pas de failles de sécurité et n'exposez pas par inadvertance des informations sensibles.

Plutôt que d'utiliser un delegate anonyme, vous pouvez aussi écrire votre méthode et utiliser CodeToRunElevated comme voici:

public void CodeToExecute()
{
    // Mon super code qui déchire (GH3 inside)
}
 
private void UneMethodeParmiDAutres()
{
    SPSecurity.CodeToRunElevated myCode = new SPSecurity.CodeToRunElevated(CodeToExecute);
    SPSecurity.RunWithElevatedPrivileges(CodeToExecute);
}

Exécuter du code avec des droits élevés, c'est bien, mais on a parfois le besoin de le faire avec un compte particulier (pour des tests par exemple). Bien sûr, un bon vieux "run as" sur l'application est possible, mais ce n'est pas toujours adapté puisque l'on lance du coup toute l'application avec ce compte et non uniquement une partie spécifique. Dans ce cas précis, il faudra se pencher sur le "SPUserToken".

Mais qu'est-ce que ce Token ? Et bien c'est un moyen pour SharePoint de connaître le mode d'authentification (Windows ou Forms) ainsi que les différentes informations sur le compte : SID de l'utilisateur + ses groupes de domaine ou l'identifiant et ses groupes, en somme, l'ensemble de son identité.

Son cadre d'utilisation est plus restreint que le RunWithElevatedPrivileges car il ne pourra être utilisé que pour instancier un SPSite:

SPUserToken token = null;
// Récupération du token depuis une liste d'utilisateurs SharePoint
using (SPSite site = new SPSite("http://monsite"))
{
    using (SPWeb web = site.RootWeb)
    {
        token = web.AllUsers["domain\\username"].UserToken;
    }
}
// Instanciation d'un nouvel SPSite avec l'identité récupérée
using (SPSite site = new SPSite("http://monsite", token))
{
    // Placer ici le code utilisant le token
}

Enfin, voici quelques pointeurs pour tout ce qui touche à l'impersonation et à l'élévation de privilèges:

Gat, SPSchizophrène

 

Commentaires

Laisser un commentaire





Validation Image CAPTCHA