我在.NET Framework 4.0程序集中有以下内容:
var newId= new WindowsIdentity(duplicateTokenHandle);
WindowsImpersonationContext newId = ImpersonatedIdentity.Impersonate();
我将其移植到ASP.Core,但找不到WindowsImpersonationContext
和WindowsIdentity.Impersonate()
。
我尝试添加以下内容:
System.Security.Claims 4.3.0
System.Security.Principal 4.3.0
System.Security.Principal.Windows 4.4.0
如何在ASP.Core中执行模拟?
更新
看起来它在.NET Core或.NET Standard中不受支持 - 是否有解决办法或者我必须辞职以定位框架?
答案 0 :(得分:3)
正如@Tratcher所提到的,你可以在.netstandard中使用RunImpersonated
。以下代码来自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
答案 1 :(得分:2)
创新。
像这样:
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
用法:
*// 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
}*