Как разобраться с кейсом: аутентификация Blazor Server, почему AuthorizeView долго получает данные об аутентификации?
Сейчас ситуация такая: изучаю Blazor Server и столкнулся с такой интересной проблемой (фичей не знаю). Есть вот такой компонент header:
<AuthorizeView> <NotAuthorized> <NavLink class="p-4 font-medium hover:bg-(--header-btn-hover)" href="/registration">Вход</NavLink> </NotAuthorized> <Authorized> <li class="main-navigation-list__item flex items-center w-full md:hidden"> <NavLink class="p-4 font-medium hover:bg-(--header-btn-hover) w-full text-center" href="/profile">Профиль</NavLink> </li> <li class="main-navigation-list__item flex items-center w-full md:hidden"> <button class="p-4 font-medium hover:bg-(--header-btn-hover) cursor-pointer w-full text-center" @onclick="@Logout">Выйти</button> </li> //Dropdown menu <details class="dropdown hover:cursor-pointer select-none hidden md:block"> <summary class="p-4 bg-black border-none list-none shadow-none text-(--white-900) font-normal hover:bg-(--header-btn-hover) hover:rounded-none">@authState.User.Identity.Name</summary> <ul class="menu dropdown-content rounded-box z-1 shadow-sm bg-black w-full"> <li class="main-navigation-list__item flex items-center w-full"> @if (NavManager.ToBaseRelativePath(NavManager.Uri) == "profile") { <span class="p-4 font-medium w-full text-center cursor-auto">Профиль</span> } else { <NavLink class="p-4 font-medium hover:bg-(--header-btn-hover) w-full text-center" href="/profile">Профиль</NavLink> } </li> <li class="main-navigation-list__item flex items-center w-full"> <button class="p-4 font-medium hover:bg-(--header-btn-hover) cursor-pointer w-full text-center" @onclick="@Logout">Выйти</button> </li> </ul> </details> </Authorized> </AuthorizeView>
По вводным: данные об аутентификации получаю при инициализации компонента:
protected override async Task OnInitializedAsync() { ClientDownloadUrl = Configuration.GetValue<string>("GameServer:ClientUrl"); authState = await AuthStateProvider.GetAuthenticationStateAsync(); }
По вводным: все бы ничего, все работает нормально, JWT токен сохраняется и считывается с него имя пользователя, НО, каждый раз, когда я обновляю страницу и пользователь уже залогинен, то происходит "мерцание" пункта меню, который отвечает за вывод имени пользователя - сначала показывается надпись "Вход" и только затем она меняется на "имя пользователя".
Сейчас ситуация такая: хотел бы узнать, какие есть способы решения данной проблемы, или это фича? Проверял использовать PersistentComponent, но результата это не принесло.
Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.
Пока нет других ответов. Будьте первым, кто поможет автору.
Ответить на вопрос
В Blazor Server
AuthorizeViewможет долго получать данные об аутентификации, потому что аутентификация идет через circuit, cookie, серверный AuthenticationStateProvider и иногда ожидает загрузки пользователя/claims из базы. В отличие от Blazor WebAssembly, тут состояние пользователя связано с серверным соединением SignalR.Сначала проверьте, где задержка: в получении cookie, в кастомном AuthenticationStateProvider, в запросе к базе или в рендере компонента. Если у вас кастомный provider, он не должен на каждый рендер ходить в базу или внешний API без кэша.
public override async Task<AuthenticationState> GetAuthenticationStateAsync() { var user = _httpContextAccessor.HttpContext?.User; return new AuthenticationState(user ?? new ClaimsPrincipal(new ClaimsIdentity())); }
Если вы загружаете профиль пользователя дополнительно, кэшируйте его на время circuit/session. Не делайте тяжелую работу внутри каждого компонента с AuthorizeView.
Пример:
<AuthorizeView> <Authorizing> <p>Проверяем доступ...</p> </Authorizing> <Authorized> <p>Доступ разрешен</p> </Authorized> </AuthorizeView><AuthorizeView> <Authorizing> <p>Проверяем доступ...</p> </Authorizing> <Authorized> <p>Доступ разрешен</p> </Authorized> </AuthorizeView>
Если задержка появляется только после обновления страницы, смотрите cookie auth и загрузку начального circuit. Если после долгого простоя — SignalR reconnect и истечение cookie. Диагностику лучше делать логами в provider: время начала/конца, источник данных и ID пользователя.