Олицетворение в ASP.NET MVC
У меня есть веб-приложение MVC в интрасети, и я хочу иметь возможность создавать файлы на нашем FTP-сервере для отправки сторонним партнерам.
Код для олицетворения использует WindowsImpersonationContext.
System.Security.Principal.WindowsImpersonationContext impersonationContext;
impersonationContext = ((System.Security.Principal.WindowsIdentity)User.Identity).Impersonate();
StreamWriter sw = System.IO.File.CreateText("PathOnFTPServer");
sw.Write("data");
impersonationContext.Undo();
Вот что происходит и причина моего вопроса:
Пред олицетворение
User.Identity.Name: [мои учетные данные Windows]
System.Security.Principal.WindowsIdentity.GetCurrent (). Имя: NT AUTHORITY \ NETWORK SERVICE
Post Олицетворение
User.Identity: [мои учетные данные Windows]
GetCurrent.Name: [мои учетные данные Windows]
Выдавать себя за отмену
User.Identity: [мои учетные данные Windows]
GetCurrent.Name: NT AUTHORITY \ NETWORK SERVICE
Итак, до того, как я олицетворю, текущий пользователь является системной учетной записью, но после олицетворения он использует мою учетную запись домена Windows, у которой есть разрешение на создание текстовых файлов на FTP-сервере. Код работает локально с использованием веб-сервера Visual Studio, но не тогда, когда я развертываю его на IIS на нашем тестовом сервере.
Я получаю ошибку "Отказано в доступе". Какова будет причина ошибки, когда правильный пользователь выдает себя за другого?
1 ответ
Олицетворение позволяет машине олицетворять машину, поэтому клиентский браузер и сервер находятся на одной странице, когда дело доходит до олицетворения. При попытке доступа к общему сетевому ресурсу компьютер не доверяет имитированным учетным данным.
Вам необходимо включить делегирование для компьютера IIS в Active Directory. Перейдите в раздел "Пользователи и компьютеры Active Directory", найдите компьютер, нажмите "Свойства" и "Доверять компьютер для делегирования". (Возможно, вам придется перезапустить IIS для этого, я не помню).
Существует гораздо больше теорий, чем я не до конца понимаю, но это должно сработать. Правильно это или нет, кто-то может прокомментировать!
Кроме того, причина, по которой он работает на вашем компьютере разработчика, заключается в том, что сервер разработки работает как разработчик, а не (локально)\Network Service.
Достойная ссылка:
http://msdn.microsoft.com/en-us/library/cc949004.aspx
В чем разница между олицетворением и делегированием?
Олицетворение передает личность исходного вызывающего абонента во внутренние ресурсы на том же компьютере. Делегирование передает исходную идентификацию вызывающего абонента во внутренние ресурсы на компьютерах, отличных от компьютера, на котором запущена служба.
Например, если служба работает в IIS без олицетворения, она будет обращаться к ресурсам, используя учетную запись ASP.NET в IIS 5.0 или учетную запись сетевой службы в IIS 6.0. С олицетворением, если клиент подключается с использованием исходной учетной записи вызывающего абонента, служба будет обращаться к таким ресурсам, как база данных SQL Server, на том же компьютере, используя исходную учетную запись вызывающего абонента вместо системной учетной записи ASP.NET. Делегирование аналогично, за исключением того, что база данных SQL Server может находиться на другом компьютере, удаленном от службы.