Назад | Перейти на главную страницу

Ограниченное делегирование работает, если пул приложений является локальной системой, но не работает, если сетевая служба в IIS 7

У меня проблема с ограниченным делегированием и IIS 7 в Windows Server 2008.

У нас есть веб-приложение, которое использует олицетворение для доступа к серверу отчетов SQL. Это нормально работало с IIS 6 как с доверенным для делегирования, так и с ограниченным делегированием. Однако мы столкнулись с проблемой с IIS 7.

Что мне удалось выяснить, так это то, что в IIS 7 с пулом приложений, работающим как NetworkService, и настроенным ограниченным делегированием, мы получаем ошибку HTTP 401 Unauthorized с сервера отчетов, а пул приложений работает как локальная система. Выдача себя за другое лицо работает нормально.

Я тестировал как классический, так и интегрированный конвейер. Ниже приведен код очень простой тестовой страницы, моделирующей эту проблему. Запуск той же тестовой страницы с сервера IIS 6 в Windows 2003 работает нормально. Любые идеи политики безопасности, конфигурации IIS или даже функций и ролей сервера, которые могут на это повлиять?

Обратите внимание, что я проверил, что Kerberos работает нормально, и конфигурация ограниченного делегирования верна.

private void testImpersonation()
{
  string url = "http://testsvr7/reportserver/";

  System.Security.Principal.WindowsIdentity user =
    (System.Security.Principal.WindowsIdentity)Context.User.Identity;
  System.Security.Principal.WindowsImpersonationContext WICTX = null;

  StringBuilder results = new StringBuilder();

  try
  {
     if (user != null)
     {
        WICTX = user.Impersonate();
        results.AppendFormat("<br />Impersonating, user: {0}",   
             System.Security.Principal.WindowsIdentity.GetCurrent().Name);

        System.Net.HttpWebRequest myHttpWebRequest =
             (HttpWebRequest)WebRequest.Create(url);

        // Assign the credentials of the user being impersonated.
        myHttpWebRequest.Credentials = CredentialCache.DefaultCredentials;

        System.Net.HttpWebResponse myHttpWebResponse =
             (HttpWebResponse)myHttpWebRequest.GetResponse();

        results.AppendFormat("<br />Authentication successful - {0}, {1}",
             url, CredentialCache.DefaultCredentials);
     }
  }
  catch (Exception ex)
  {
     results.AppendFormat("<br />Exception: {0}", ex.Message);
  }
  finally
  {
     if (WICTX != null)
     WICTX.Undo();
  }
  Response.Write(results.ToString());

Я считаю, что нашел решение - если я установил для свойства useAppPoolCredentials system.webServer / security / authentication / windowsAuthentication значение «true», тогда AppPool с NetworkService отлично работает с ограниченным делегированием.

Протестировано как на Windows Server 2008, так и на 2008 R2.

Я не уверен, почему это так, и мне было очень трудно получить действительно четкую документацию о том, что делает этот параметр и как он может повлиять на эту ситуацию. Это значение можно установить с помощью редактора конфигурации в диспетчере IIS для IIS в 2008 R2.
Или используйте следующую команду (единственный способ, который я нашел для 2008 года (не R2)):

%windir%\system32\inetsrv\appcmd set config "Default Web Site/MyApplication" /section:system.webServer/security/authentication/windowsAuthentication /useAppPoolCredentials:true /commit:MACHINE/WEBROOT/APPHOST