Frage

Ich brauche mich als Domain-Benutzer in einer ASP.NET-Anwendung Identitätswechsel auf VMWare-Maschine läuft. Da die VMWare-Maschine nicht selbst in der Domäne ist, ist ASP.NET nicht in der Lage, die Benutzertoken (angegeben in web.config) zu lösen. Gibt es eine Möglichkeit, das zu tun?

Vielen Dank im Voraus, Petr

War es hilfreich?

Lösung

Ich benutze diese Klasse ich die ganze Zeit geschrieben und es wirkt wie ein Zauber!

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
}

Dann rufen Sie es von der Client-Klasse wie:

//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();
            }
}

Good Luck!

Andere Tipps

Dies kann die stumme offensichtliche Antwort, aber Sie könnten Ihre VMWare Maschine zur Domäne hinzufügen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top