WindowsImpersonationContext & Impersonate() not found in ASP.Core - Printable Version +- 0Day Forums (https://zeroday.vip) +-- Forum: Coding (https://zeroday.vip/Forum-Coding) +--- Forum: Asp.Net (https://zeroday.vip/Forum-Asp-Net) +--- Thread: WindowsImpersonationContext & Impersonate() not found in ASP.Core (/Thread-WindowsImpersonationContext-amp-Impersonate-not-found-in-ASP-Core) |
WindowsImpersonationContext & Impersonate() not found in ASP.Core - Sirroster7 - 07-23-2023 I had the following in a .NET Framework 4.0 assembly: ```cs var newId = new WindowsIdentity(duplicateTokenHandle); WindowsImpersonationContext newId = ImpersonatedIdentity.Impersonate(); ``` I'm porting it to ASP.Core, but `WindowsImpersonationContext` and `WindowsIdentity.Impersonate()` aren't found. I've tried adding the following: | Type | Version | | ----------------------------------- | ------- | | `System.Security.Claims` | `4.3.0` | | `System.Security.Principal` | `4.3.0` | | `System.Security.Principal.Windows` | `4.3.0` | How do I perform impersonation in ASP.Core? **Update** It looks like it's not supported in .NET Core or .NET Standard - is there a work-around or do I have to resign to targeting the framework? RE: WindowsImpersonationContext & Impersonate() not found in ASP.Core - uzia329 - 07-23-2023 As @Tratcher mentioned you can use the `RunImpersonated` in .netstandard. The following code sniped is taken from [here]( [To see links please register 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 RE: WindowsImpersonationContext & Impersonate() not found in ASP.Core - purpura843 - 07-23-2023 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 }* |