Как разобраться с кейсом: аутентификация Blazor Server, почему AuthorizeView долго получает данные об аутентификации?

Ссылка скопирована
1 ответ

Сейчас ситуация такая: изучаю 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, но результата это не принесло.

Нужно решить такую задачу?

Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.

Заказать помощь
Лучший ответ
1
Павел Админов Ответ

В Blazor Server AuthorizeView может долго получать данные об аутентификации, потому что аутентификация идет через circuit, cookie, серверный AuthenticationStateProvider и иногда ожидает загрузки пользователя/claims из базы. В отличие от Blazor WebAssembly, тут состояние пользователя связано с серверным соединением SignalR.

Сначала проверьте, где задержка: в получении cookie, в кастомном AuthenticationStateProvider, в запросе к базе или в рендере компонента. Если у вас кастомный provider, он не должен на каждый рендер ходить в базу или внешний API без кэша.

public override async Task&lt;AuthenticationState&gt; GetAuthenticationStateAsync()
{
    var user = _httpContextAccessor.HttpContext?.User;
    return new AuthenticationState(user ?? new ClaimsPrincipal(new ClaimsIdentity()));
}

public override async Task&lt;AuthenticationState&gt; GetAuthenticationStateAsync() { var user = _httpContextAccessor.HttpContext?.User; return new AuthenticationState(user ?? new ClaimsPrincipal(new ClaimsIdentity())); }

Если вы загружаете профиль пользователя дополнительно, кэшируйте его на время circuit/session. Не делайте тяжелую работу внутри каждого компонента с AuthorizeView.

  • проверьте, не вызывается ли GetAuthenticationStateAsync слишком часто;
  • уберите сетевые вызовы из provider или добавьте кэш;
  • проверьте размер claims: слишком много claims замедляет cookie;
  • проверьте SignalR reconnect и latency;
  • добавьте Authorizing-шаблон, чтобы UI не выглядел зависшим.

Пример:

&lt;AuthorizeView&gt;
  &lt;Authorizing&gt;
    &lt;p&gt;Проверяем доступ...&lt;/p&gt;
  &lt;/Authorizing&gt;
  &lt;Authorized&gt;
    &lt;p&gt;Доступ разрешен&lt;/p&gt;
  &lt;/Authorized&gt;
&lt;/AuthorizeView&gt;

&lt;AuthorizeView&gt; &lt;Authorizing&gt; &lt;p&gt;Проверяем доступ...&lt;/p&gt; &lt;/Authorizing&gt; &lt;Authorized&gt; &lt;p&gt;Доступ разрешен&lt;/p&gt; &lt;/Authorized&gt; &lt;/AuthorizeView&gt;

Если задержка появляется только после обновления страницы, смотрите cookie auth и загрузку начального circuit. Если после долгого простоя — SignalR reconnect и истечение cookie. Диагностику лучше делать логами в provider: время начала/конца, источник данных и ID пользователя.

Другие ответы (0)

Пока нет других ответов. Будьте первым, кто поможет автору.

Ответить на вопрос

комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Вам также может быть интересно