Невозможно записать на подключенный диск, используя олицетворение

В основном у меня та же проблема, что и в этом сообщении Доступ к подключенным дискам при выдаче себя за другое лицо в ASP.NET

Я работаю над устаревшим веб-сайтом, и мне нужно разрешить администраторам изменять логотип сайта, баннеры и т. Д. С файла изображения на своих рабочих столах на подключенный диск на сервере.

Итак, их веб-сайт использует олицетворение всякий раз, когда необходимо сохранить на диске, и он работает нормально; однако я не могу заставить его работать ни в их тестовой среде, ни в моей тестовой среде.

Любые идеи? Я дважды проверил пользователя и пароль (в коде не указан домен), и проблема не в этом.

Вот отрывок из кода, обрабатывающего олицетворение:

public bool ImpersonateUser(String user, String password, String domain)
{
    WindowsIdentity tempWindowsIdentity;
    IntPtr token = IntPtr.Zero;
    IntPtr tokenDuplicate = IntPtr.Zero;

    if (RevertToSelf())
    {
        if (LogonUserA(user, 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;
                }
            }
        }
    }
    //... rest of the code

И -sanitized- тест:

if (impUtility.ImpersonateUser("user", "password", string.Empty))
{
    fu.SaveAs(@"C:\Images\" + imgName);
}

person Gastón    schedule 30.06.2010    source источник


Ответы (1)


Я тоже не мог заставить это работать.

Потом я понял, что даже если бы я смог это реализовать, есть более простой способ. Что я сделал, так это предоставил общий доступ к папке на целевой машине и дал пользователям, которые будут использовать мое приложение, только разрешения на чтение и запись.

//Impersonate user to save file on server
WindowsIdentity wi = (WindowsIdentity)User.Identity;
WindowsImpersonationContext wic = null;

try
{
    wic = wi.Impersonate();
    if (wi.IsAuthenticated)
        asyncFileUpload.SaveAs(location);
}
catch (Exception ex)
{
    //Log Error or notify here
    success = false;
}
finally
{
    if (wic != null)
        wic.Undo();
}

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

person Ed B    schedule 30.06.2010
comment
@ Эд Б: Спасибо, я попробую. Однако у меня есть пара вопросов: 1) ¿Означает ли это решение, что все администраторы должны входить в систему с одной и той же учетной записью? 2) Я не понял, зачем вам нужно создавать подключенный диск для каждого пользователя; в моем примере администраторы будут входить в систему со своими учетными записями, но когда они собираются записывать на диск, используются имя пользователя и пароль из привилегированной учетной записи (полученной из Web.config) - person Gastón; 30.06.2010
comment
1. Нет, они этого не делают. Если пользователь уже вошел на ваш сайт с учетными данными Windows, вы можете олицетворять личность вошедшего в систему пользователя на целевой машине, как я делаю выше. 2. Хорошо, я не знал, что это была привилегированная учетная запись. Я даже не мог заставить метод подключенных дисков работать с моей учетной записью, уже настроенной с подключенными дисками. - person Ed B; 01.07.2010