Олицетворение в 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 на нашем тестовом сервере.

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

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