WindowsImpersonationContext & Impersonate() not found in ASP.Core
Necromancing.
Like this:
using System.Security.Principal;namespace regeditor{ public class WindowsLogin : System.IDisposable { protected const int LOGON32_PROVIDER_DEFAULT = 0; protected const int LOGON32_LOGON_INTERACTIVE = 2; public WindowsIdentity Identity = null; private System.IntPtr m_accessToken; [System.Runtime.InteropServices.DllImport("advapi32.dll", SetLastError = true)] private static extern bool LogonUser(string lpszUsername, string lpszDomain, string lpszPassword, int dwLogonType, int dwLogonProvider, ref System.IntPtr phToken); [System.Runtime.InteropServices.DllImport("kernel32.dll", CharSet = System.Runtime.InteropServices.CharSet.Auto)] private extern static bool CloseHandle(System.IntPtr handle); // AccessToken ==> this.Identity.AccessToken //public Microsoft.Win32.SafeHandles.SafeAccessTokenHandle AT //{ // get // { // var at = new Microsoft.Win32.SafeHandles.SafeAccessTokenHandle(this.m_accessToken); // return at; // } //} public WindowsLogin() { this.Identity = WindowsIdentity.GetCurrent(); } public WindowsLogin(string username, string domain, string password) { Login(username, domain, password); } public void Login(string username, string domain, string password) { if (this.Identity != null) { this.Identity.Dispose(); this.Identity = null; } try { this.m_accessToken = new System.IntPtr(0); Logout(); this.m_accessToken = System.IntPtr.Zero; bool logonSuccessfull = LogonUser( username, domain, password, LOGON32_LOGON_INTERACTIVE, LOGON32_PROVIDER_DEFAULT, ref this.m_accessToken); if (!logonSuccessfull) { int error = System.Runtime.InteropServices.Marshal.GetLastWin32Error(); throw new System.ComponentModel.Win32Exception(error); } Identity = new WindowsIdentity(this.m_accessToken); } catch { throw; } } // End Sub Login public void Logout() { if (this.m_accessToken != System.IntPtr.Zero) CloseHandle(m_accessToken); this.m_accessToken = System.IntPtr.Zero; if (this.Identity != null) { this.Identity.Dispose(); this.Identity = null; } } // End Sub Logout void System.IDisposable.Dispose() { Logout(); } // End Sub Dispose } // End Class WindowsLogin } // End Namespace
Usage:
*// WindowsIdentity user = (WindowsIdentity)context.User.Identity;// using (WindowsIdentity user = WindowsIdentity.GetCurrent())using (WindowsLogin wi = new WindowsLogin("Administrator", System.Environment.MachineName, "TOP_SECRET")){ #if NET461 using (user.Impersonate()) #else WindowsIdentity.RunImpersonated(wi.Identity.AccessToken, () => #endif { WindowsIdentity useri = WindowsIdentity.GetCurrent(); System.Console.WriteLine(useri.Name); } #if !NET461 ); #endif}*
As @Tratcher mentioned you can use the RunImpersonated
in .netstandard. The following code sniped is taken from here.
var user = (WindowsIdentity)context.User.Identity;#if NET461 using (user.Impersonate())#else WindowsIdentity.RunImpersonated(user.AccessToken, () =>#endif { // var useri = WindowsIdentity.GetCurrent(); }#if !NET461 );#endif