Rappresentazione e ripristinoImpersonating and Reverting

Talvolta può essere necessario ottenere un token di account Windows per rappresentare un account Windows.Sometimes you might need to obtain a Windows account token to impersonate a Windows account. Può essere necessario, ad esempio, che l'applicazione basata su ASP.NET agisca per conto di più utenti in momenti diversi.For example, your ASP.NET-based application might have to act on behalf of several users at different times. L'applicazione potrebbe accettare un token che rappresenta un amministratore da Internet Information Services (IIS), rappresentare tale utente, eseguire un'operazione e ripristinare l'identità precedente.Your application might accept a token that represents an administrator from Internet Information Services (IIS), impersonate that user, perform an operation, and revert to the previous identity. In seguito potrebbe accettare un token da IIS che rappresenta un utente con meno diritti, eseguire un'operazione e di nuovo il ripristino.Next, it might accept a token from IIS that represents a user with fewer rights, perform some operation, and revert again.

Nelle situazioni in cui l'applicazione deve rappresentare un account Windows che non è stato associato al thread corrente da IIS, è necessario recuperare il token di tale account e usarlo per attivare l'account.In situations where your application must impersonate a Windows account that has not been attached to the current thread by IIS, you must retrieve that account's token and use it to activate the account. A tale scopo, è possibile eseguire queste attività:You can do this by performing the following tasks:

  1. Recuperare un token di un account per un particolare utente eseguendo una chiamata al metodo LogonUser non gestito.Retrieve an account token for a particular user by making a call to the unmanaged LogonUser method. Questo metodo non si trova nella libreria di classi base di .NET Framework, ma nel file advapi32.dll non gestito.This method is not in the .NET Framework base class library, but is located in the unmanaged advapi32.dll. L'accesso ai metodi nel codice non gestito è un'operazione avanzata che non rientra nell'ambito di questo argomento.Accessing methods in unmanaged code is an advanced operation and is beyond the scope of this discussion. Per altre informazioni, vedere Interoperabilità con codice non gestito.For more information, see Interoperating with Unmanaged Code. Per altre informazioni sul metodo LogonUser e su advapi32.dll, vedere la documentazione di Platform SDK.For more information about the LogonUser method and advapi32.dll, see the Platform SDK documentation.

  2. Creare una nuova istanza della classe WindowsIdentity, passando il token.Create a new instance of the WindowsIdentity class, passing the token. Il codice seguente illustra questa chiamata, dove hToken rappresenta un token di Windows.The following code demonstrates this call, where hToken represents a Windows token.

    WindowsIdentity ImpersonatedIdentity = new WindowsIdentity(hToken);  
    
    Dim ImpersonatedIdentity As New WindowsIdentity(hToken)  
    
  3. Iniziare la rappresentazione creando una nuova istanza di WindowsImpersonationContext classe e inizializzandola con la WindowsIdentity.Impersonate metodo della classe inizializzata, come illustrato nel codice seguente.Begin impersonation by creating a new instance of the WindowsImpersonationContext class and initializing it with the WindowsIdentity.Impersonate method of the initialized class, as shown in the following code.

    WindowsImpersonationContext MyImpersonation = ImpersonatedIdentity.Impersonate();  
    
    WindowsImpersonationContext MyImpersonation = ImpersonatedIdentity.Impersonate()  
    
  4. Quando si non è più necessaria, chiamare il WindowsImpersonationContext.Undo metodo per ripristinare la rappresentazione, come illustrato nel codice seguente.When you no longer need to impersonate, call the WindowsImpersonationContext.Undo method to revert the impersonation, as shown in the following code.

    MyImpersonation.Undo();  
    
    MyImpersonation.Undo()  
    

Se il codice attendibile ha già associato un WindowsPrincipal oggetto al thread, è possibile chiamare il metodo di istanza Impersonate, che non accetta un token di account.If trusted code has already attached a WindowsPrincipal object to the thread, you can call the instance method Impersonate, which does not take an account token. Si noti che questo è utile solo quando l'oggetto WindowsPrincipal nel thread rappresenta un utente diverso da quello per cui il processo è attualmente in esecuzione.Note that this is only useful when the WindowsPrincipal object on the thread represents a user other than the one under which the process is currently executing. Questa situazione può verificarsi, ad esempio, quando si usa ASP.NET con l'autenticazione di Windows attivata e la rappresentazione disattivata.For example, you might encounter this situation using ASP.NET with Windows authentication turned on and impersonation turned off. In questo caso, il processo viene eseguito con un account configurato in Internet Information Services (IIS), mentre l'entità corrente rappresenta l'utente di Windows che sta accedendo alla pagina.In this case, the process is running under an account configured in Internet Information Services (IIS) while the current principal represents the Windows user that is accessing the page.

Si noti che né ImpersonateAnnulla modifiche di principale oggetto (IPrincipal) associato al contesto chiamata corrente.Note that neither Impersonate nor Undo changes the Principal object (IPrincipal) associated with the current call context. La rappresentazione e il ripristino modificano invece il token associato al processo del sistema operativo corrente.Rather, impersonation and reverting change the token associated with the current operating system process..

Vedere ancheSee Also

WindowsIdentity
WindowsImpersonationContext
Oggetti Principal e IdentityPrincipal and Identity Objects
Interoperabilità con codice non gestitoInteroperating with Unmanaged Code