J'ai eu ce qui suit dans un assemblage .NET Framework 4.0:
var newId= new WindowsIdentity(duplicateTokenHandle);
WindowsImpersonationContext newId = ImpersonatedIdentity.Impersonate();
Je le porte sur ASP.Core, mais WindowsImpersonationContext
et WindowsIdentity.Impersonate()
ne sont pas trouvés.
J'ai essayé d'ajouter ce qui suit:
System.Security.Claims 4.3.0
System.Security.Principal 4.3.0
System.Security.Principal.Windows 4.4.0
Comment effectuer l'emprunt d'identité dans ASP.Core?
Mise à jour
Il semble que ce ne soit pas pris en charge dans .NET Core ou .NET Standard - y a-t-il une solution ou dois-je démissionner pour cibler le cadre?
Nécromancement.
Comme ça:
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
}*
Comme @Tratcher l'a mentionné, vous pouvez utiliser le RunImpersonated
dans .netstandard. Le code suivant est extrait de ici .
var user = (WindowsIdentity)context.User.Identity;
#if NET461
using (user.Impersonate())
#else
WindowsIdentity.RunImpersonated(user.AccessToken, () =>
#endif
{
// var useri = WindowsIdentity.GetCurrent();
}
#if !NET461
);
#endif