ASP.NET: Imitieren gegen eine Domäne auf VMWare
-
07-07-2019 - |
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
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