本文介绍了WindowsImpersonationContext &在 ASP.Core 中找不到 Impersonate()的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我在 .NET Framework 4.0 程序集中有以下内容:
I had the following in a .NET Framework 4.0 assembly:
var newId = new WindowsIdentity(duplicateTokenHandle);
WindowsImpersonationContext newId = ImpersonatedIdentity.Impersonate();
我正在将它移植到 ASP.Core,但是没有找到 WindowsImpersonationContext
和 WindowsIdentity.Impersonate()
.
I'm porting it to ASP.Core, but WindowsImpersonationContext
and WindowsIdentity.Impersonate()
aren't found.
我尝试添加以下内容:
类型 | 版本 |
---|---|
System.Security.Claims | 4.3.0 |
System.Security.Principal | 4.3.0 |
System.Security.Principal.Windows | 4.3.0 |
如何在 ASP.Core 中执行模拟?
How do I perform impersonation in ASP.Core?
更新
看起来它在 .NET Core 或 .NET Standard 中不受支持 - 是否有解决方法,或者我是否必须辞职以针对框架?
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?
推荐答案
Necromancing.
像这样:
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
用法:
*// 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
}*
这篇关于WindowsImpersonationContext &在 ASP.Core 中找不到 Impersonate()的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!