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

IIS выдает себя за 401 Unauthorized (2x asp.net MVC)

У меня есть веб-сайт 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.