У меня проблема с ограниченным делегированием и 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