У меня есть веб-приложение .net / c # (web api) с аутентификацией Windows. Служба размещена на моем локальном компьютере, IIS 10. Идентификатор пула приложений, установленный для меня, в данный момент зарегистрирован в Windows. Компьютер находится в домене активного каталога.
Я хочу получить доступ к общему файлу, используя учетную запись, которая в данный момент вошла в приложение. Файл имеет соответствующие разрешения. Для этого я использую олицетворение так:
if (HttpContext.Current.User.Identity is WindowsIdentity windowsIdentity)
{
using (windowsIdentity.Impersonate())
{
FileStream stream = new FileStream(@"\\server\share\file.ext", FileMode.Open, FileAccess.Read);
}
}
Я вхожу в систему с текущей учетной записью Windows, так же, как установлено в удостоверении пула приложений. Это прекрасно работает с общим файлом на локальном компьютере, где размещено приложение. Но не работает с удаленным общим файлом, расположенным на другом компьютере. Другой компьютер также находится в домене активного каталога.
С хост-компьютера я могу получить доступ к общему файлу с помощью проводника Windows или моего браузера. Кроме того, если я не выдаю себя за пользователя, .net пытается получить доступ к общему файлу с учетной записью удостоверения пула приложений (установленному для того же пользователя, я), и это успешно выполняется как для локальных, так и для удаленных файлов.
Он также работает с олицетворенной идентификацией, полученной из метода LogonUser от advapi32.dll. Но для этого требуется пароль пользователя, и я не хочу запрашивать пароль у пользователя, уже вошедшего в приложение.
Что я делаю не так?
Обновление : если общий файл находится на хост-компьютере, то событие входа в систему, созданное окнами (вкладка безопасности в средстве просмотра событий), показывает нужного пользователя. Если общий файл находится на другом компьютере, то событие входа в систему, созданное Windows на этом компьютере, показывает анонимный пользователь. Итак, аккаунт как-то потерян.
Обновление 2 : Олицетворение работает, если я запускаю сайт на IIS, как localhost (localhost in url). Но если я запускаю его, используя ip или имя сайта, он перестает работать.
Обновление 3 : Wireshark отображает запрос на получение заявки (для доступа к общему файловому серверу) для делегирования, с ошибкой «KRB5KDC_ERR_BADOPTION NT Status: STATUS_NOT_FOUND». В AD разрешено делегирование для пользователя пула приложений.
Один и тот же билет (для cifs / fileshareservername) без делегирования может быть успешно получен (показывает wireshark) при выполнении команды Dir в cmd. Кажется, проблема в нашей эры.