Blazor Server .NET 8: как правильно получить доступ к ProtectedLocalStorage после входа в систему с помощью NavigationMaC#

Место общения программистов C#
Ответить
Anonymous
 Blazor Server .NET 8: как правильно получить доступ к ProtectedLocalStorage после входа в систему с помощью NavigationMa

Сообщение Anonymous »

После успешного входа в систему (аутентификация на основе JWT, хранящаяся в protectedLocalStorage) я хочу выполнить перенаправление на ReturnUrl, если он существует.
Когда ReturnUrl -страница назначения- имеет атрибут Authorize и выполняется GetAuthenticationStateAsync(), protectedLocalStorage становится нулевым после NavigationManager.NavigateTo() выполняется.
Это соответствующий код для страницы входа

Код: Выделить всё

await protectedLocalStorage.SetAsync("authToken", token);
NavigationManager.NavigateTo(ReturnUrl ?? "");
И я пытаюсь получить protectedLocalStorage в GetAuthenticationStateAsync() вот так

Код: Выделить всё

ProtectedBrowserStorageResult result;
try
{
result = await protectedLocalStorage.GetAsync("authToken"); //protectedLocalStorage is null after the redirect
}
catch
{
result = new();
}

var anonymous = new ClaimsPrincipal(new ClaimsIdentity());

if (!result.Success) //Since protectedLocalStorage is null I get redirected back to login page.
{
return new AuthenticationState(anonymous);
}
Я отключил предварительную отрисовку в App.razor, и она работает нормально, за исключением попыток перенаправления на авторизованный компонент

Код: Выделить всё


@code {
[CascadingParameter] private HttpContext HttpContext { get; set; } = default!;

private IComponentRenderMode? RenderModeForPage => HttpContext.Request.Path.StartsWithSegments("/Account/Login") ? null : new InteractiveServerRenderMode(prerender: false);
//I added this because when login page's render mode is interactive server, it keeps reloading indefinitely
}
Страница входа продолжает перезагружаться, как указано в комментарии выше, из-за этого кода в AccountLayout

Код: Выделить всё

protected override void OnParametersSet()
{
if (HttpContext is null)
{
// If this code runs, we're currently rendering in interactive mode, so there is no HttpContext.
// The identity pages need to set cookies, so they require an HttpContext. To achieve this we
// must transition back from interactive mode to a server-rendered page.
NavigationManager.Refresh(forceReload: true);
}
}
Если я обычно перехожу к авторизованному компоненту, щелкая ссылку или вводя URL-адрес после входа в систему, он работает правильно. Это происходит только после использования функции NavigationManager.NavigateTo().
Похоже, что функция NavigateTo() вызывает GetAuthenticationStateAsync() слишком рано в жизненном цикле Blazor, поэтому protectedLocalStorage еще не готов.
Я думаю, что проблема связана с режимом рендеринга страницы входа, поэтому как это сделать получить protectedLocalStorage правильно?

Подробнее здесь: https://stackoverflow.com/questions/792 ... er-login-u
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»