2008-11-10 6 views
2

Je dois me faire passer pour un utilisateur de domaine dans une application ASP.NET s'exécutant sur une machine VMWare. Étant donné que la machine VMWare n'est pas elle-même dans le domaine, ASP.NET est incapable de résoudre le jeton utilisateur (spécifié dans web.config). Y-a-t-il un moyen de faire ça?ASP.NET: Emprunter l'identité d'un domaine sur VMWare

Merci à l'avance, Petr

Répondre

1

J'utilise cette classe que j'ai écrite tout le temps et ça fonctionne comme un charme!

using System; 
using System.Security.Principal; 

/// <summary> 
/// Changes the security context the application runs under. 
/// </summary> 
public class ImpersonateHelper : IDisposable 
{ 
    [System.Runtime.InteropServices.DllImport("Kernel32")] 
    private extern static Boolean CloseHandle(IntPtr handle); 

    private IntPtr _token = IntPtr.Zero; 
    private WindowsImpersonationContext _impersonatedUser = null; 

    public IntPtr Token 
    { 
     get { return _token; } 
     set { _token = value; } 
    } 

    public ImpersonateHelper(IntPtr token) 
    { 
     _token = token; 
    } 

    /// <summary> 
    /// Switch the user to that set by the Token property 
    /// </summary> 
    public void Impersonate() 
    { 
     if (_token == IntPtr.Zero) 
      _token = WindowsIdentity.GetCurrent().Token; 

     _impersonatedUser = WindowsIdentity.Impersonate(_token); 
    } 

    /// <summary> 
    /// Revert to the identity (user) before Impersonate() was called 
    /// </summary> 
    public void Undo() 
    { 
     if (_impersonatedUser != null) 
      _impersonatedUser.Undo(); 
    } 

    #region IDisposable Members 
    private bool _isDisposed; 

    public void Dispose() 
    { 
     Dispose(true); 
     GC.SuppressFinalize(this); 
    } 

    protected virtual void Dispose(bool disposing) 
    { 
     if (!_isDisposed) 
     { 
      if (disposing) 
      { 
       if (_impersonatedUser != null) 
        _impersonatedUser.Dispose(); 

      } 
      CloseHandle(_token); 
      _token = IntPtr.Zero; 
     } 
     _isDisposed = true; 
    } 

    ~ImpersonateHelper() 
    { 
     Dispose(false); 
    } 
    #endregion 
} 

Ensuite, vous l'appelez de la classe client comme:

//Run task as the impersonated user and not as NETWORKSERVICE or ASPNET (in IIS5) 
try{ 
    impersonate.Impersonate(); 
    //Do work that needs to run as domain user here... 
} 
finally 
{ 
      //Revert impersonation to NETWORKSERVICE or ASPNET 
      if (impersonate != null) 
      { 
       impersonate.Undo(); 
       impersonate.Dispose(); 
      } 
} 

Bonne chance!

-4

Cela peut être la réponse évidente stupide, mais vous pouvez ajouter votre machine VMWare vers le domaine.

+2

Pas si vous n'avez pas de droits d'administration de domaine vous ne pouvez pas. – saschabeaumont

+0

Je n'ai pas les droits d'administrateur de domaine, mais mon patron. Tout ce que je fais, c'est lui montrer que je ne peux plus travailler jusqu'à ce que le problème soit résolu. Par conséquent, mes machines virtuelles sont ajoutées assez rapidement. –

+0

N'est-ce pas une solution à faible coût et à faible coût? –

Questions connexes