У нас есть приложение Blazor Server («интерфейс»), которое вызывает внутренний API ASP.NET.
Оба приложения размещены в IIS на одном компьютере, но в разных пулах приложений.
Аутентификация осуществляется только Windows Auth (без JWT, файлов cookie и т. д.).
На нашем старом сервере разработки эта настройка работает нормально.
Вкл. новый тестовый сервер с (по-видимому) идентичной конфигурацией IIS, каждый вызов от внешнего интерфейса к внутреннему возвращает 401 Unauthorized.
Настройка развертывания
- Фронтенд: ASP.NET Core Blazor Server, размещенный в IIS
- Бэкенд: ASP.NET, размещенный в IIS
- Оба сайты на одном Windows Server, разные пулы приложений.
- Аутентификация Windows включена, поставщики: Negotiate, NTLM (одинаковый
порядок на обоих серверах). - Анонимная аутентификация отключена на обоих, Windows Auth включена на обоих.
- Пользователи являются пользователями домена в AD; авторизация основана на ролях
Что я вижу
На старом сервере разработки (работает):
Фронтенд показывает правильное имя пользователя в пользовательском интерфейсе.
Ведение журнала внутри DelegatingHandler показывает правильного пользователя домена.
Бэкэнд принимает вызов, возвращает 200, а журналы IIS показывают то же имя пользователя.
На новом тестовом сервере (не работает):
Фронтенд по-прежнему показывает правильное имя пользователя.
DelegatingHandler регистрирует правильный WindowsIdentity для запроса.
Бэкэнд возвращает 401 Несанкционировано.
В серверных журналах IIS столбец имени пользователя для этих вызовов имеет значение - (анонимный).
У нас есть страница отладки разрешений, которая выводит все группы/роли AD; для протестированных нами пользователей разрешения правильные и соответствуют тем, что работают на dev.
Это дамп из серверных журналов неудавшегося запроса:
Код: Выделить всё
---------------------------------------------------------------------------------------------------------------
| Field | Value |
|--------------------|----------------------------------------------------------------------------------------|
| date | 2025-11-18 |
| time | 10:20:25 |
| s-ip | 10.xxx.xxx.xxx |
| cs-method | POST |
| cs-uri-stem | /_blazor/negotiate |
| cs-uri-query | negotiateVersion=1 |
| s-port | 443 |
| cs-username | - |
| c-ip | 10.xxx.xxx.xxx |
| cs(User-Agent) | Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 Chrome/138.0.0.0 Safari/537.36 |
| cs(Referer) | https://vm-url.mah.roche.com/Meters |
| sc-status | 401 |
| sc-substatus | 2 |
| sc-win32-status | 5 |
| time-taken (ms) | 1875 |
---------------------------------------------------------------------------------------------------------------
Что я пытаюсь понять
Почему серверная часть видит запрос как анонимный (пользователь = - в журнале IIS), хотя:
- Blazor работает под управлением Windows Auth
- HttpContext.User является действительным пользователем домена
- Используется WindowsIdentity.RunImpersonatedAsync(user.AccessToken, …)
Какие настройки учетной записи IIS / SPN / компьютера следует сравнить на двух серверах, чтобы понять, почему учетные данные не передаются на внутренний сайт?
Любые подсказки о том, что обычно вызывает ситуацию «интерфейсный интерфейс видит пользователя, серверная часть видит анонимный 401» на двух сайтах IIS на одном компьютере с Windows Auth и олицетворением, будут оценены, а также указатели на то, на что следует обратить внимание дальше (SPN, useKernelMode, NTLM) против Kerberos и т. д.).
Подробнее здесь: https://stackoverflow.com/questions/798 ... 1-on-new-i
Мобильная версия