Олицетворение пользователя в .Net Core

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

Вот код

 #region Impersionation global variables
        public const int LOGON32_LOGON_INTERACTIVE = 2;
        public const int LOGON32_PROVIDER_DEFAULT = 0;

        [DllImport("advapi32.dll")]
        public static extern int LogonUserA(String lpszUserName,
            String lpszDomain,
            String lpszPassword,
            int dwLogonType,
            int dwLogonProvider,
            ref IntPtr phToken);
        [DllImport("advapi32.dll", CharSet = CharSet.Auto, SetLastError = true)]
        public static extern int DuplicateToken(IntPtr hToken,
            int impersonationLevel,
            ref IntPtr hNewToken);

        [DllImport("advapi32.dll", CharSet = CharSet.Auto, SetLastError = true)]
        public static extern bool RevertToSelf();

        [DllImport("kernel32.dll", CharSet = CharSet.Auto)]
        public static extern bool CloseHandle(IntPtr handle);
        #endregion

Олицетворение функции

 private bool ImpersonateUser(string domain, string userName, string password)
        {
            WindowsIdentity tempWindowsIdentity;
            IntPtr token = IntPtr.Zero;
            IntPtr tokenDuplicate = IntPtr.Zero;


            if (RevertToSelf())
            {
//This logonUserA does not run correctly
                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);

                        WindowsIdentity.RunImpersonated(tempWindowsIdentity.AccessToken,() =>
                        {
                            CloseHandle(token);
                            CloseHandle(tokenDuplicate);
                        });

                    }
                }
            }
            if (token != IntPtr.Zero)
                CloseHandle(token);
            if (tokenDuplicate != IntPtr.Zero)
                CloseHandle(tokenDuplicate);
            return false;
        }

Функция LogonUserA неправильно входит в систему. Я правильно ввожу доменное имя, имя пользователя и пароль, но это все равно не работает.

Любые идеи будут оценены


person Learn AspNet    schedule 27.08.2019    source источник
comment
Начните с использования LogonUserW. Редко уместно использовать A версии функций Win32 API. Это не обязательно решит эту проблему, но предотвратит некоторые другие проблемы.   -  person madreflection    schedule 28.08.2019
comment
@madreflection Спасибо, это не решило эту проблему. У тебя есть другие идеи?   -  person Learn AspNet    schedule 28.08.2019
comment
Нет, и не предполагалось. При использовании версии W, по крайней мере, теперь ему не нужно переводить Unicode в текущую кодовую страницу, чтобы сделать вызов, а затем переводить обратно, поэтому ваши строки не будут преобразованы во что-то, что не будет соответствовать значениям, которые они должны совпадать.   -  person madreflection    schedule 28.08.2019
comment
Я думаю, что олицетворение должно быть настроено в вашем IIS и (возможно) в вашем сервере Windows (если я помню старые добрые времена)   -  person hugo    schedule 28.08.2019
comment
@hugo: настройка олицетворения заставляет IIS выполнять олицетворение, однако вы также можете олицетворять пользователя так, как это делает Learn AspNet. Это полезно, если у вас есть IIS, олицетворяющий одну учетную запись домена с веб-ориентированными разрешениями, но вам нужно использовать другого пользователя домена для аутентификации Windows на SQL-сервере (не лучший дизайн, но я видел).   -  person madreflection    schedule 28.08.2019
comment
Что вы получаете от GetLastError() после сбоя LogonUserA? Передача пароля на сервер не кажется хорошей идеей :\   -  person fenixil    schedule 28.08.2019
comment
Можете ли вы также предоставить более подробную информацию о своем прецеденте: почему вы хотите выдавать себя за пользователя, является ли «пользователь» клиентом, который сделал запрос к вашему веб-приложению, или у вас есть какой-то жестко запрограммированный пользователь (например, системная учетная запись), как вы получаете пароль. это поможет нам лучше понять контекст и избежать проблемы XY (возможно, вам не нужно олицетворение вообще ¯_(ツ)_/¯ ?)   -  person fenixil    schedule 28.08.2019