使用ASP.NET成员资格提供程序进行模拟

时间:2009-12-02 15:54:28

标签: asp.net .net asp.net-membership impersonation

我有一个自定义会员/角色提供者,由于项目的性质,它将要求管理员以协助他们查询的方式登录用户。

现在,使用选定的会员帐户轻松重新登录管理员,但这意味着管理员将被有效注销。我正在寻找一种方法来允许管理员冒充用户,但随时可以轻松切换回自己的帐户。

有什么建议吗?

1 个答案:

答案 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();
}