Олицетворение с использованием поставщика членства ASP.NET - PullRequest
1 голос
/ 02 декабря 2009

У меня есть пользовательский поставщик членства / ролей, поскольку в силу характера проекта администраторам потребуется входить в систему как пользователи, помогая им с запросами.

Теперь, просто войти в систему администратора с выбранной учетной записью, однако это означает, что администратор будет эффективно отключен. Я ищу способ, позволяющий администраторам выдавать себя за пользователей, но при этом очень легко в любое время переключиться обратно на свою учетную запись.

Есть предложения?

1 Ответ

0 голосов
/ 02 декабря 2009

Это должно быть то, что вы хотите.

Вы можете вызвать метод 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();
}
...