Un peu de mon expérience dans le monde .NET
# Monday, August 27, 2007
Changer le WindowsIdentity en cours d’exécution (impersonalisation)…

 Par défaut, le WindowsIdentity (system.security.principal) est celui de l’utilisateur logué, et est récupérable en utilisant l’instruction suivante :

WindowsIdentity.GetCurrent()

 

Dans le cadre d’un projet, j’avais besoin que mon code s’execute temporairement sous une autre identité que celle de l’utilisateur executant l’application. Après quelques recherche, voici les trois étapes a effectuer :

 

1 - Se loguer avec le nouveau compte

 

Pour se faire, on va utiliser l’API advapi32, dont voici la signature :

[DllImport("advapi32.dll", SetLastError=true)]
public static extern bool LogonUser(
    string lpszUsername,
    string lpszDomain,
    string lpszPassword,
    int dwLogonType,
    int dwLogonProvider,
    out IntPtr phToken
    );

 

Le code suivant retourne vrai si le login à réussi. Il retourne surtout le handler du token lié à ce login, que nous utiliserons plus tard.

LogonUser(

« nom d’utilisateur »,

« domaine »,

« mot de passe »,

2,

0,

ref TokenHandler)

 

2 – Dupliquer le token

 

A nouveau, il faut utiliser l’API advapi32 :

[DllImport("advapi32.dll", SetLastError=true)]
public extern static bool DuplicateToken(IntPtr ExistingTokenHandle, int
   SECURITY_IMPERSONATION_LEVEL, out IntPtr DuplicateTokenHandle);

 

Le code suivant retourne vrai si la duplication à réussie. Il retourne aussi le token utiliser plus tard afin de créer un nouveau WindowsIdentity.

DuplicateToken(

TokenHandler,

2,

ref pDuplicateTokenHandle);

 

 

3 – Créer un nouveau WindowsIdentity

 

Opération qui est un jeu d’enfant, via le code suitant :

 

WindowsIdentity newId = new WindowsIdentity(pDuplicateTokenHandle);

WindowsImpersonationContext impersonatedUser = newId.Impersonate();

 

 

Dorénavant, WindowsIdentity.GetCurrent() retoune le nouveau WindowsIdentity et le code s’execute avec les droits de celui-ci. Pour revenir à l’état avant impersonalisation, il suffit d’utiliser la méthode Undo de WindowsImpersonationContext


Monday, August 27, 2007 3:09:47 PM (GMT Daylight Time, UTC+01:00)  #    Comments [0]  Securité