Олицетворение в веб-приложении ASP.NET не работает при запуске на IIS

Я работаю над веб-приложением ASP.NET 4.0 MVC3, которое работает в среде интрасети. Приложение использует проверку подлинности Windows. Его пул приложений запускается пользователем домена, для которого на контроллере домена установлено значение spn. Аутентификация работает с использованием Kerberos (в IE и Firefox после некоторой дополнительной настройки).

Теперь я хочу загрузить файлы на sharepoint, но для меня важно загрузить файл, так как пользователь в данный момент вошел в приложение (поэтому файл создается на Sharepoint с его / ее учетными данными).

У меня есть следующий код в ResourceExists(Uri uri) функция:

'...
    Dim identity As System.Security.Principal.WindowsIdentity = HttpContext.User.Identity
    Dim impersonationContext = identity.Impersonate()
    response = request.GetResponse()
    impersonationContext.Undo()
'...

Это работает при локальном запуске, но при развертывании на сервере я получаю исключение:

System.Net.WebException: The remote server returned an error: (401) Unauthorized.\r\n   at WebDav.WebDavClient.ResourceExists(Uri uri)\r\n   at Website.Website.WebdavController.Upload(HttpPostedFileBase file, UploadViewModel vm)

Я прочитал кое-что о передаче учетных данных, что невозможно с NTLM, но я уверен, что использую Kerberos (я проверил заголовки с помощью wireshark и fiddler), и я вижу следующее:

Authorization: Negotiate YIIFpQYGKwYBBQUCoIIFmTCCBZWgJDAiBgkqhkiC9x...

Есть идеи, почему олицетворение не работает при запуске на сервере IIS?

3 ответа

Решение

Я нашел ответ здесь:

http://support.microsoft.com/kb/810572

"Kerberos не работает в архитектуре с балансировкой нагрузки, и IIS возвращается к аутентификации NTLM. Поскольку вы не можете использовать NTLM для делегирования, любые приложения или службы, требующие делегирования, не работают. Для получения дополнительной информации щелкните следующий номер статьи, чтобы просмотреть статья в Microsoft"

И это было именно так. Я попробовал сейчас с другой машиной, которая не сбалансирована по нагрузке, и она работает.

Единственное, что меня до сих пор удивляет, это то, что ImpersonationLevel идентичности все еще Impersonate не Delegate...

После настройки <identity impersonate="true"/> в вашем web.config попробуйте следующее:

using (((WindowsIdentity)User.Identity).Impersonate())
using (var client = new WebClient { Credentials = CredentialCache.DefaultNetworkCredentials })
{
    string result = client.DownloadString("http://sharepoint");
}

Вам нужно правильно настроить свой сайт в IIS, чтобы олицетворение работало.

см. Настройка аутентификации олицетворения ASP.NET (IIS 7)

Другие вопросы по тегам