У меня есть веб-сайт IIS с включенной аутентификацией Windows (только) (скажем, site.domain.com). Мой сайт вызывает HTTP rest API на своем дочернем сайте (скажем, site.domain.com/api). Это другое приложение. Он работает нормально, когда я вызываю этот API как идентификатор пула приложений. Когда я использую олицетворение, я получаю ошибку 401 Неавторизовано.
Детали настройки сервера IIS:
Серверы IIS балансируются нагрузкой с помощью стороннего балансировщика нагрузки. Два сайта в диспетчере IIS выглядят так образ
На обоих сайтах включена только проверка подлинности Windows и ведется переговоры в качестве первого поставщика. На обоих сайтах разный пул приложений. Эти пулы приложений имеют одинаковую идентификацию пула приложений (скажем, DOMAIN \ apppool). Настройка Spn есть (видите, я все перепробовал):
PS C:\WINDOWS> setspn.exe -l DOMAIN\apppool
Registered ServicePrincipalNames for SOMECN:
HTTP/site/api
HTTP/site.domain.com/api
HTTP/site
HTTP/site.domain.com
Я могу общаться с обоими сайтами, используя Kerberos. useAppPoolCredentials = True и useKernelMode = false настроены для обоих сайтов. В учетной записи пула приложений AD отмечена опция «Доверять этому пользователю для делегирования любой службе (только Kerberos)»
Ошибка:
Журнал IIS для неудачного запроса с использованием олицетворения:
2017-10-04 14:40:57 192.168.81.101 GET /api/Test/Impersonate - 443 - 192.168.81.21 - - 401 2 5 1433
2017-10-04 14:40:57 192.168.81.101 GET /api/Test/Impersonate - 443 - 192.168.81.21 - - 401 1 2148074254 0
2017-10-04 14:40:57 192.168.81.101 GET /api/Test/Impersonate - 443 - 192.168.81.21 - - 401 1 5 15
Журнал IIS для успешной попытки с использованием учетных данных пула приложений (без олицетворения):
2017-10-04 13:52:28 192.168.81.101 GET /api/Test/Impersonate - 443 - 192.168.81.21 - - 401 2 5 0
2017-10-04 13:52:28 192.168.81.101 GET /api/Test/Impersonate - 443 DOMAIN\apppool 192.168.81.21 - - 200 0 0 15
Детали приложения:
Приложение успешно работает на моей машине разработки. Проблема только в производстве. На машине разработки я использую свое имя хоста для доступа к сайту.
Вот как я вызываю сайт API из своего контроллера MVC:
[HttpGet]
public ViewResult ImpersonateTest()
{
System.Security.Principal.WindowsImpersonationContext impersonationContext;
impersonationContext =
((System.Security.Principal.WindowsIdentity)User.Identity).Impersonate();
using (var client = new WebClient() { UseDefaultCredentials = true })
{
ViewBag.User = client.DownloadString(GlobalConfig.ApiPath + $"Test/Impersonate");
}
impersonationContext.Undo();
return View();
}
Если я удалю первые три строки, используются учетные данные пула приложений, и все будет работать должным образом. Но я хочу использовать олицетворение c.