У меня есть проект 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 ()?
Можно ли использовать токен текущего пользователя и выдавать себя за этого пользователя в фоновом потоке? Если да, то как это можно сделать, и требуются ли какие-либо права доступа пользователя для этого?