Windows Олицетворение и дублирование токенов - PullRequest
5 голосов
/ 12 декабря 2011

У меня есть проект asp.net, где запрос делегирует работу в фоновом режиме (через quartz.net). Веб-приложение использует проверку подлинности Windows и олицетворение.

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

IntPtr token;
var successfullLogon = LogonUser(userName, password, domain, logonType, logonProvider, out token);
if(successfullLogon == false)
{
    var errorCode = Marshal.GetHRForLastWin32Error();
    Marshal.ThrowExceptionForHR(errorCode);
}

Это работает, но требует, чтобы я либо указал конкретное имя пользователя / пароль, либо попросил пользователя ввести свой пароль. ни одна ситуация не идеальна.

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

var token = ((WindowsIdentity)Request.User.Identity).GetToken().ToInt64();
var token = new IntPrt(token from request);
IntPtr duplicate;
try
{
    if(NaviteMethod.DuplicateToken(token, SecurityImpersonationLevel.Impersonate, out duplicate) == false)
    {
        var errorCode = Marshal.GetHRForLastWin32Error();
        Marshal.ThrowExceptionForHR(errorCode);
    }

    using(var identity = new WindowsIdentity(duplicate))
    using(var context = identity.Impersonate())
    {
        //do work
        context.Undo();
    }
}
finally
{
    if(duplicate != IntPtr.Zero)
    {
        NaviteMethod.CloseHandler(duplicate);
    }
}

Но я получаю исключение Выполняется операция ввода-вывода с перекрытием

Из этого сообщения поступают вызовы NativeMethod: Как передать учетные данные на компьютер, чтобы на нем можно было использовать Microsoft.Win32.RegistryKey.OpenRemoteBaseKey ()?

Можно ли использовать токен текущего пользователя и выдавать себя за этого пользователя в фоновом потоке? Если да, то как это можно сделать, и требуются ли какие-либо права доступа пользователя для этого?

1 Ответ

1 голос
/ 13 декабря 2011

К сожалению, вы не можете обойти «LogonUser». Один из вариантов - использовать Олицетворение ASP.NET . Второй у вас уже есть, если вы замените первые две строки вашего второго кодового блока на первый код блока.

...