0Day Forums
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

}*