Олицетворение в 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

Сообщение о олицетворении

User.Identity: [мои учетные данные для Windows]

GetCurrent.Name: [мои учетные данные для Windows]

Олицетворять Отменить

User.Identity: [мои учетные данные для Windows]

GetCurrent.Name: NT AUTHORITY \ NETWORK SERVICE

Таким образом, до того, как я выдал себя за себя, текущий пользователь является Системной учетной записью, но после олицетворения использует мою учетную запись домена Windows, которая имеет разрешение на создание текстовых файлов на FTP-сервере. Код работает локально с использованием веб-сервера визуальной студии, но не тогда, когда я развертываю его в IIS на нашем тестовом сервере.

Я получаю ошибку отказа в доступе. Какова будет причина ошибки при выдаче правильного пользователя?

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

Вам необходимо включить делегирование для машины 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. При олицетворении, если клиент подключается с использованием учетной записи первоначального вызывающего абонента, служба будет обращаться к ресурсам, таким как firebase database SQL Server, на том же компьютере, используя учетную запись исходного пользователя, вместо учетной записи ASP.NET системы. Делегирование аналогично, за исключением того, что firebase database SQL Server может находиться на другой машине, которая является удаленной для службы.

Давайте будем гением компьютера.