ASP.NET отказывается уважать мои полномочия.
Мне удалось успешно выдавать себя за пользователя. Использование Interlog LogonUser, например
[DllImport("advapi32.dll", SetLastError = true)]
static extern bool LogonUser(
string principal,
string authority,
string password,
LogonSessionType logonType,
LogonProvider logonProvider,
out IntPtr token);
Это прекрасно работает. Когда я перехожу к моему непосредственному окну и вхожу в WindowsIdentity.GetCurrent().Name
, олицетворенный пользователь показывает как мой CurrentUser. Когда я освобождаю этого пользователя, он возвращается к моему реальному пользователю. Здесь нет проблем - я олицетворяю себя.
Однако, когда я пытаюсь записать файл в общий доступ, к которому пользователь имеет доступ, я получаю:
Access to the path [path name] denied.
.
Мне удалось вручную войти в Windows, поскольку я являюсь олицетворением, навигацией и написанием файла для общего доступа. Пользователь определенно имеет административные привилегии для каталога, на который я нацелен.
Я разрешаю конечному пользователю загрузить файл и использовать объект HttpPostedFileBase
, напишите файл на этот ресурс. По сути, я ограничиваю олицетворение блоком кода для загрузки файла. После его завершения он возвращается к исходному аутентифицированному пользователю LDAP, например.
imp = Impersonation.ImpersonateUser("someuser","somepassword");
HttpPostedFileBase hpf = Request.Files[file] as HttpPostedFileBase;
...
hpf.SaveAs(path);
Impersonation.StopImpersonating(imp);
Правильный путь.
Когда я сохраняю файл с помощью метода SaveAs
, он уважает мое олицетворение?
Он пытается записать файл под другой учетной записью, о которой я не знаю? И если да, то как я могу это изменить?
Кажется, что не существует большого контроля с помощью метода SaveAs
, а не одной перегрузки. Существуют ли какие-либо другие альтернативы использованию этого объекта, которые позволили бы мне больше контролировать мои учетные данные?
Ответы
Ответ 1
Это звучит как проблема аутентификации с двойной перестановкой. Попробовали ли вы предоставить сетевой ресурс изменить доступ к пользователю IIS по умолчанию для вашего сайта (например, ASPNET) и запустить POST/SaveAs без кода олицетворения? Если это не удается, вы должны посмотреть, не настроены ли настройки в IIS, которые могут привести к ошибкам аутентификации хоста сервера. Здесь может быть полезно начать:
http://weblogs.asp.net/owscott/archive/2008/08/22/iis-windows-authentication-and-the-double-hop-issue.aspx
Ответ 2
Вы говорите "напишите файл на эту долю". Для общего доступа есть отдельные разрешения, чем в папке на компьютере. Вы проверили разрешения на доступ к ресурсам?
Ответ 3
Попробуйте настроить значение LogonSessionType. Я думаю, для того, чтобы сохранить сетевой ресурс, вам нужно иметь его как "Сеть", а по умолчанию - "Интерактивный".
Дополнительная информация: Как использовать олицетворение и делегирование в ASP.NET 2.0