478 / 241 / 74
Регистрация: 25.05.2012
Сообщений: 1,136
Записей в блоге: 1
.NET 8

Браузер > Blazor server > API: "сквозная" аутентификация Windows?

19.01.2026, 14:46. Показов 742. Ответов 16
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день!
Приложения Blazor и Web API оба хостятся на IIS. В отличие от десктоп-клиента, Blazor передает identity аккаунта Аpplication Pool.
Использую как HttpClient, так и SignalR.
Если я правильно понимаю, то нужно отключить аутентификацию Windows на IIS и в проекте Web API, и переконфигурировать HttpClient/SignalR и авторизующее middleware, чтобы "вручную" передавать и получать identity конечного пользователя.

Как это лучше сделать?
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
19.01.2026, 14:46
Ответы с готовыми решениями:

Server-side Blazor, аутентификация/авторизация
Задайте, пожалуйста, хотя бы общие направления (может подробные мануалы есть?). По туториалам и по...

Blazor server-side: тестирование
Имеет ли смысл вообще писать тесты для blazor-страниц? И как это правильно делать? * термин...

Насколько надёжно web socket соединение Blazor Server?
Хочу написать приложение с применением Blazor Server. WebAssembly точно не вариант. По кнопке будет...

16
HF
 Аватар для HF
1316 / 895 / 200
Регистрация: 09.09.2011
Сообщений: 2,688
Записей в блоге: 2
19.01.2026, 15:02
Цитата Сообщение от NewOrdered Посмотреть сообщение
и переконфигурировать HttpClient/SignalR и авторизующее middleware, чтобы "вручную" передавать и получать identity конечного пользователя.
Вот это можно поподробнее. Это вы так думаете, или же вы уже готовы авторизацию руками реализовать?

Цитата Сообщение от NewOrdered Посмотреть сообщение
Как это лучше сделать?
Про лучше не уверен, но мне кажется достаточно
- установить "Microsoft.AspNetCore.Authentication.Neg otiate"
- инициализировать через .AddNegotiate()
и уже будет доступен WindowsIdentity (ClaimsIdentity) в контексте запроса.

А дальше уже настраивать то как именно у вас авторизация будет проходить - требования, точка входа и т.п..
0
478 / 241 / 74
Регистрация: 25.05.2012
Сообщений: 1,136
Записей в блоге: 1
19.01.2026, 15:20  [ТС]
Цитата Сообщение от HF Посмотреть сообщение
и уже будет доступен WindowsIdentity (ClaimsIdentity) в контексте запроса.
в контексте запроса от десктоп-клиента - identity Windows пользователя, а от Blazor - Application Pool identity, сконфигурированный в IIS.

Добавлено через 6 минут
Цитата Сообщение от HF Посмотреть сообщение
Это вы так думаете, или же вы уже готовы авторизацию руками реализовать?
Если честно, то изобретать велосипед аутентификации не хочется. Хочется единообразного решения, покрывающего оба случая.
А авторизация и так уже реализована на стороне Web API.
0
HF
 Аватар для HF
1316 / 895 / 200
Регистрация: 09.09.2011
Сообщений: 2,688
Записей в блоге: 2
19.01.2026, 15:24
Цитата Сообщение от NewOrdered Посмотреть сообщение
а от Blazor - Application Pool identity, сконфигурированный в IIS.
Это вроде бы тот же "WindowsIdentity (ClaimsIdentity)". Или вы его как то по другому представляете?
ClaimsIdentity - контейнер для уже авторизованного пользователя. По сути туда попадают всё что прошло стандартные протоколы авторизации. Ядро авторизации AspNetCore запихнёт туда то что считает нужным.
Поэтому и был вопрос - сами будете протокол реализовывать или нет.
Ну вот, а если была Negotiate авторизация, то текущий Identity будет типа WindowsIdentity. В котором уже содержится намного больше информации - токен доменной авторизации/аутентификации, списки групп в которые входит пользователь. По токену можно будет делать имперсонализацию или запросы в домен для получения более полной информации о полученных данных.

Что по вашему "Application Pool identity"? Там вроде бы даже написано - текущий пользователь. В зависимости от настроек, там будет или системный аккаунт, или пользователь компа, или домена. Но в любом случае - виндовый пользователь, который идентифицируется как WindowsIdentity.
0
478 / 241 / 74
Регистрация: 25.05.2012
Сообщений: 1,136
Записей в блоге: 1
19.01.2026, 15:27  [ТС]
Цитата Сообщение от HF Посмотреть сообщение
Что по вашему "Application Pool identity"? Там вроде бы даже написано - текущий пользователь. В зависимости от настроек, там будет или системный аккаунт, или пользователь компа, или домена. Но в любом случае - виндовый пользователь, который идентифицируется как WindowsIdentity.
Все верно. Но это не тот пользователь, который открыл страницу браузера.
0
HF
 Аватар для HF
1316 / 895 / 200
Регистрация: 09.09.2011
Сообщений: 2,688
Записей в блоге: 2
19.01.2026, 15:31
Цитата Сообщение от NewOrdered Посмотреть сообщение
Если честно, то изобретать велосипед аутентификации не хочется. Хочется единообразного решения, покрывающего оба случая.
А авторизация и так уже реализована на стороне Web API.
Тогда проверьте то что я сказал и посмотрите что у вас будет в наличии после запроса. "Приложение" в одну страницу создайте.

В гугле ввёл "c# aspnetcore blazor negotiate simple webapp"
ИИ выдал пример простейшего приложения.

Добавлено через 2 минуты
Цитата Сообщение от NewOrdered Посмотреть сообщение
Все верно. Но это не тот пользователь, который открыл страницу браузера.
Потому что в случае с IIS нужно держать в уме, что это пользователь из под которого запущено приложение. Например, когда приложение обратится в БД, то там конечно будет этот пользователь, а не тот что в браузере.
0
478 / 241 / 74
Регистрация: 25.05.2012
Сообщений: 1,136
Записей в блоге: 1
19.01.2026, 15:35  [ТС]
Цитата Сообщение от HF Посмотреть сообщение
Потому что в случае с IIS нужно держать в уме, что это пользователь из под которого запущено приложение. Например, когда приложение обратится в БД, то там конечно будет этот пользователь, а не тот что в браузере.
Так отсюда мой изначальный вопрос: как заставить Balzor "прокинуть" аутентифицированного пользователя из запроса браузера в запрос к Web API?
0
HF
 Аватар для HF
1316 / 895 / 200
Регистрация: 09.09.2011
Сообщений: 2,688
Записей в блоге: 2
19.01.2026, 15:38
Цитата Сообщение от NewOrdered Посмотреть сообщение
Так отсюда мой изначальный вопрос: как заставить Balzor "прокинуть" аутентифицированного пользователя из запроса браузера в запрос к Web API?
Делали что я выше показал? Не приходит? Что в HttpContext.User ?
0
478 / 241 / 74
Регистрация: 25.05.2012
Сообщений: 1,136
Записей в блоге: 1
19.01.2026, 16:33  [ТС]
Цитата Сообщение от HF Посмотреть сообщение
Тогда проверьте то что я сказал и посмотрите что у вас будет в наличии после запроса. "Приложение" в одну страницу создайте.
Цитата Сообщение от HF Посмотреть сообщение
Про лучше не уверен, но мне кажется достаточно
- установить "Microsoft.AspNetCore.Authentication .Neg otiate"
- инициализировать через .AddNegotiate()
На стороне IIS / IIS Express уже настроена аутентификация. Blazor видит аутентифицированного Windows пользователя.

Цитата Сообщение от HF Посмотреть сообщение
Что в HttpContext.User ?
На стороне Blazor - пользователь, запустивший браузер.
Дальше в загрузчике страницы делаю запрос к API (эндпоинт возвращает информацию об авторизации). На его стороне - identity виртуального аккаунта ApplicationPoolIdenity
0
HF
 Аватар для HF
1316 / 895 / 200
Регистрация: 09.09.2011
Сообщений: 2,688
Записей в блоге: 2
19.01.2026, 16:56
Вот это не понял.
Цитата Сообщение от NewOrdered Посмотреть сообщение
На стороне IIS / IIS Express уже настроена аутентификация. Blazor видит аутентифицированного Windows пользователя.
На стороне Blazor - пользователь, запустивший браузер.
Видит или не видит? Или где увидели (или настроили?) "пользователя, запустившего браузер"?

Цитата Сообщение от NewOrdered Посмотреть сообщение
Дальше в загрузчике страницы делаю запрос к API (эндпоинт возвращает информацию об авторизации). На его стороне - identity виртуального аккаунта ApplicationPoolIdenity
Можно увидеть, как это в коде? Чтоб я понял что вы точно смотрите там где я надеюсь.

И хотелось бы ещё Program.cs увидеть где всё это настраивается. Как минимум, чтобы сравнить с тем что микрософт рекомендует для блейзора.
А то может быть ещё у вас какой-нибудь режим сервера стоит, то там наверняка авторизация вообще по другому работает. (так как я с Блейзором никогда не работал и не хочу, то именно в этой теме у меня опыта нет, только по чтению новостей и статей).
0
478 / 241 / 74
Регистрация: 25.05.2012
Сообщений: 1,136
Записей в блоге: 1
19.01.2026, 17:24  [ТС]
Blazor page:
C#
1
2
3
4
5
6
7
8
9
protected override async Task OnInitializedAsync()
{
    var state = await AuthStateProvider.GetAuthenticationStateAsync();
    _blazorUser = state.User.Identity?.Name; // DOMAIN\<MyWindowsUserName>
 
        
    var userInfo = await UserInfoService.GetUserInfo();
     _apiUser = userInfo.UserName; // IIS APPPOOL\<ApplicationPoolIdentity>
}
API service:
C#
1
2
3
4
5
6
7
8
9
10
11
12
public async Task<UserInfo> GetUserInfo(WindowsIdentity windowsIdentity)
    {
        var roles = _roleMappingService.GetRoles(windowsIdentity).ToList();
        var userInfo = new UserInfo
        {
            Username = windowsIdentity.Name,
            Roles = roles,
 
        };
 
        return userInfo;
    }
API controller:
C#
1
2
3
4
5
6
7
8
9
10
    [HttpGet]
    public async Task<IActionResult> GetUserInfo()
    {
        if (User.Identity is not WindowsIdentity identity || !identity.IsAuthenticated)
            return Unauthorized();
        
        var userInfo = await _userInfoService.GetUserInfo(identity);
 
        return Ok(userInfo);
    }
API program.cs
C#
1
2
 builder.Services.AddAuthentication(NegotiateDefaults.AuthenticationScheme)
    .AddNegotiate();
На стороне Blazor аутентификация не настроена, т.к. ее выполняет хост (IIS/IIS Express). Если ее настроить явно в program.cs, то приложение падает при запуске.
0
HF
 Аватар для HF
1316 / 895 / 200
Регистрация: 09.09.2011
Сообщений: 2,688
Записей в блоге: 2
19.01.2026, 21:35
Цитата Сообщение от NewOrdered Посмотреть сообщение
На стороне Blazor аутентификация не настроена, т.к. ее выполняет хост (IIS/IIS Express). Если ее настроить явно в program.cs, то приложение падает при запуске.

C#
1
2
 builder.Services.AddAuthentication(NegotiateDefaults.AuthenticationScheme)
    .AddNegotiate();
Это оно и есть. А что ещё можно явно настроить?

Цитата Сообщение от NewOrdered Посмотреть сообщение
C#
1
2
    var state = await AuthStateProvider.GetAuthenticationStateAsync();
    _blazorUser = state.User.Identity?.Name; // DOMAIN\<MyWindowsUserName>
Не оно?

Не знаю кто такой AuthStateProvider, но User.Identity это оно и есть.

Цитата Сообщение от NewOrdered Посмотреть сообщение
C#
1
2
3
4
var userInfo = await UserInfoService.GetUserInfo();
...
API service:
public async Task<UserInfo> GetUserInfo(WindowsIdentity windowsIdentity)
Наверное ошибка?
не UserInfoService.GetUserInfo() а UserInfoService.GetUserInfo(state.User.Identity)?
Но врят ли вы бы столько забыли скопировать.

Потому что странно что при этом User правильный, а из WinIdentity другой. Обычно так не бывает.
Или бывает если кто-то вызывает WindowsIdentity.CurrentUser() (как-то так), тогда там да, будет AppPool.

Вы просто не можете глянуть что находится в Identity? HttpContext.User.Identity без всяких аутсервисов, которые не понятно откуда берут данные.
C#
1
2
3
// HttpContext.User -> dump (вдруг там несколько удостоверений)
// HttpContext.User.Identity -> dump
// ((WindowsIdentity)HttpContext.User.Identity) -> dump
0
478 / 241 / 74
Регистрация: 25.05.2012
Сообщений: 1,136
Записей в блоге: 1
20.01.2026, 00:57  [ТС]
HF, я наверное в исходном посте недостаточно подробно объяснил.
Blazor server app и Web API это два разных приложения (проекта) в одном решении. У каждого своя конфигурация в своем собственном program.cs, appsettings.json, launchsettings.json. Web API проект - это «серверная» часть (контроллеры+сервисы), Blazor app - «клиентская» (UI + HttpClient).
Оба хостятся на IIS, каждый в своем отдельном Application Pool.
0
478 / 241 / 74
Регистрация: 25.05.2012
Сообщений: 1,136
Записей в блоге: 1
20.01.2026, 09:22  [ТС]
Цитата Сообщение от HF Посмотреть сообщение
Наверное ошибка?
скорее не совсем удачные (совпадающие) имена сервисов и методов. В Blazor app UserInfoService это служба по отношению к компоненту Blazor (регистрируется в контейнере DI и инжектируется), но по факту она обращается (HttpClient) к эндпоинту API, где дергается служба с таким же именем. Понимаю, не самый лучший выбор для примера.
0
478 / 241 / 74
Регистрация: 25.05.2012
Сообщений: 1,136
Записей в блоге: 1
20.01.2026, 09:30  [ТС]
0
HF
 Аватар для HF
1316 / 895 / 200
Регистрация: 09.09.2011
Сообщений: 2,688
Записей в блоге: 2
20.01.2026, 11:13
Цитата Сообщение от NewOrdered Посмотреть сообщение
я наверное в исходном посте недостаточно подробно объяснил.
Да вроде бы уже более менее понятно и много подробностей. Но, здесь я уже ничем не смогу помочь. Пользователя браузера вы умеете получать, а дальшейние сложности видимо связаны с архитектурой текущей реализации. В таком случае я бы наверное сам бы копался долго, чтобы сначала разобраться, а потом найти нужный подход.
Общие советы (особенно с которыми я сам работаю) без проблем, могу попробовать предлагать. Возможно у кого-то реализованы подобные варианты и смогут помочь, но я врят ли.
0
478 / 241 / 74
Регистрация: 25.05.2012
Сообщений: 1,136
Записей в блоге: 1
20.01.2026, 17:40  [ТС]
Лучший ответ Сообщение было отмечено HF как решение

Решение

В общем после ресерча стало понятно что "из коробки" сквозная аутентификация Windows работать не будет и не должна (именно из-за double-hop). Одним из чистых и масштабируемых решений будет создание отдельной службы Identity Provider Service, управляющей выдачей JWT для различных сценариев: веб-клиент (Blazor Server/WASM), десктоп клиент (WinForms/WPF) и пр.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
20.01.2026, 17:40
Помогаю со студенческими работами здесь

Blazor (server-side): избавиться от _Host.cshtml
Есть проект следующей структуры: 1. Библиотека общих классов и компонентов Blazor. В т.ч. в ней...

Приложение Blazor Server не запускается
Здравствуйте. Подскажите, пожалуйста. Создаю приложение Blazor Server и сразу при запуске он выдает...

Добавление Blazor Server в Asp net core MVC 8
Здравствуйте. Не подскажете, пожалуйста? Пытаюсь добавить blazor server в asp net core mvc 8 и...

Blazor Server не вызывает Dispose() при переходе на несуществующую страницу
Доброе утро! В общем вопрос в теме. Есть код, который запускает таймер при вызове компонента ...

Blazor server App на MacOs
Возможно, здесь есть разработчики, которые юзают МакОс? Делаю проект на Блазор - blazor server...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
Опции темы

Новые блоги и статьи
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это дополнительная запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru