Criei um aplicativo de teste para mostrar meu problema usando o Blazor Hybrid com .NET MAUI (.net 9) com o AuthenticationState de um usuário.
Meu projeto de teste no github: https://github.com/tPeif/blazorhybrid_authProblem
Existem 2 componentes ArticleCategoryComponentExtra
: ArticleCategoryHtmlComponent
. O conteúdo é encapsulado em um AuthorizeView
. Ambos os componentes mostram uma lista de categorias de artigos existentes e devem exibir um pop-up para adicionar uma nova categoria ArticeCategory
clicando no botão com o ID addCategorybtn
.
Após completar o modal e clicar no botão salvar, a SaveDetail
Função é chamada.
private async Task SaveDetail()
{
// user is logged in
var ok = await CheckAuthentication();
try
{
await ArticleCategoryService.Add(_selectedDetail);
// user is logged in
var ok1 = await CheckAuthentication();
await Load();
// user is logged in
var ok2 = await CheckAuthentication();
ShowCategoryDetail = false;
var ok3 = await CheckAuthentication();
}
catch (Exception ex)
{
string action = _selectedDetail.Id == 0 ? "add" : "update";
_logger.LogError(ex, "Cannot {action} the category '{categoryName}'", action, _selectedDetail.Name);
}
}
[Inject]
public AuthenticationStateProvider AuthenticationStateProvider { get; set; } = default!;
private async Task<bool> CheckAuthentication()
{
var authState = await AuthenticationStateProvider.GetAuthenticationStateAsync();
var user = authState.User;
if (!user.Identity.IsAuthenticated)
{
// Redirect to login or show an error message
_logger.LogError("User not logged in anymore");
return false;
}
return true;
}
Como você pode ver, estou verificando o estado de autenticação atual várias vezes. Ao final da função, o usuário está logado e o modal é removido.
Os eventos do ciclo de vida das páginas são chamados várias vezes para atualizar a página, mas em um momento o OnInitialized é chamado novamente, o que deve significar (pelo menos para mim) que a página é completamente renderizada novamente e esse é o momento em que o usuário não está mais conectado.
Alguém tem alguma ideia do porquê o aplicativo se comporta dessa forma e o que devo fazer para evitar o logout do usuário?