Поскольку решение о том, какую личность имитировать, основано на данных времени выполнения, вам, вероятно, придется иметь дело с имитацией программно.
Я использую комбинацию взаимодействия и WindowsIdentity для обработки имитации.Следующие шаги:
- Войдите в систему с помощью взаимодействия
LogonUserA()
, который заполняет дескриптор IntPtr (token
). - Дублируйте токен с помощью взаимодействия
DuplicateToken()
. - Создание нового идентификатора Windows, например:
var identity = new WindowsIdentity(tokenDuplicate);
. - Создание контекста олицетворения с помощью:
var context = identity.Impersonate();
- Закрытие обоих токенов с помощью взаимодействия
CloseHandle()
- Когда закончите олицетворение, отмените контекст олицетворения с помощью:
context.Undo();
Я держу одноразовый класс для обработки деталей.Шаги 1-5 выполняются в конструкторе, а шаг 6 - в процедуре удаления.Это помогает гарантировать, что я вернусь должным образом даже при возникновении исключения.
При таком подходе, поскольку вы передаете учетные данные с помощью метода службы, схема аутентификации web.config не является полностью принудительной.Однако, если вы используете встроенную аутентификацию Windows, вы можете программно олицетворять текущего пользователя с помощью HttpContext.Current.User.Identity.Impersonate (), не передавая учетные данные в методе службы.
На стороне ивы, возможно, уже знаете, PInvoke.net является ценным ресурсом для настройки подписей для методов взаимодействия.