我有一个自定义会员/角色提供者,由于项目的性质,它将要求管理员以协助他们查询的方式登录用户。
现在,使用选定的会员帐户轻松重新登录管理员,但这意味着管理员将被有效注销。我正在寻找一种方法来允许管理员冒充用户,但随时可以轻松切换回自己的帐户。
有什么建议吗?
答案 0 :(得分:0)
这应该是你想要的东西。
您可以使用所需域帐户的用户名和密码调用ImpersonateValidUser方法。然后在注销时将其反转。
您应该可以将其弯曲以与自定义成员资格提供程序一起使用。
// Constants for impersonation
private WindowsImpersonationContext impersonationContext;
public const int LOGON32_LOGON_INTERACTIVE = 2;
public const int LOGON32_PROVIDER_DEFAULT = 0;
/// <summary>
/// Changes the account we are running under.
/// </summary>
/// <param name="username">Username of a local admin account</param>
/// <param name="domain">Domain of the username</param>
/// <param name="password">Password of a local admin account</param>
/// <returns></returns>
private bool ImpersonateValidUser(String username, String domain, String password)
{
WindowsIdentity tempWindowsIdentity;
IntPtr token = IntPtr.Zero;
IntPtr tokenDuplicate = IntPtr.Zero;
if (RevertToSelf())
{
if (LogonUserA(username, domain, password, LOGON32_LOGON_INTERACTIVE,
LOGON32_PROVIDER_DEFAULT, ref token) != 0)
{
if (DuplicateToken(token, 2, ref tokenDuplicate) != 0)
{
tempWindowsIdentity = new WindowsIdentity(tokenDuplicate);
impersonationContext = tempWindowsIdentity.Impersonate();
if (impersonationContext != null)
{
CloseHandle(token);
CloseHandle(tokenDuplicate);
return true;
}
}
}
}
if (token != IntPtr.Zero)
CloseHandle(token);
if (tokenDuplicate != IntPtr.Zero)
CloseHandle(tokenDuplicate);
return false;
}
/// <summary>
/// Cancel the impersonation and revent the thread to the
/// default account. Typically DOMAIN\NETWORK_SERVICE or similar.
/// </summary>
private void UndoImpersonation()
{
impersonationContext.Undo();
}