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?
O problema é que, ao fechar o componente de diálogo, o aplicativo é reiniciado. Adicione um ID de GUID ao formulário e você verá que obterá uma nova instância sempre que clicar no botão Salvar no diálogo.
Isso realmente me intrigou por um tempo até que vi as
form
tags HTML.O que acontece é que, quando você clica no botão, o formulário é enviado de volta para o servidor. Remova o
form
, ou defina o tipo de botão comotype="button"
e o problema desaparece. Chega de envios.Você provavelmente deveria usar
EditForm
.