Олицетворение в ASP.NET MVC - PullRequest
       30

Олицетворение в ASP.NET MVC

23 голосов
/ 10 сентября 2009

У меня есть веб-приложение 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 Ответ

25 голосов
/ 10 сентября 2009

Олицетворение позволяет машине олицетворять машину, поэтому клиентский браузер и сервер находятся на одной странице, когда речь заходит об имитации. Когда вы затем пытаетесь получить доступ к общему сетевому ресурсу, компьютер не доверяет олицетворенным учетным данным.

Необходимо включить делегирование для компьютера 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 может находиться на другом компьютере, удаленном от службы.

...