OBTER USUARIO LOGADO EM UM COMPONENT BLAZOR

NOWLIGHTS 22/02/2023 14:52:11
#501043
Olá,

Implementei components blazor em minha aplicação ASP.Net Core MVC para realizar tarefas de forma mais dinamica, porém, precisava obter o usuario logado e redirecionar caso não esteja mais logado, e consegui da seguinte forma;

  @inject AuthenticationStateProvider _authProvider;
@code{
private AuthenticationState _auth;
protected override async Task OnInitializedAsync()
{
var authStateProvider = (AuthenticationStateProvider)_authProvider;
authStateProvider.AuthenticationStateChanged += HandleAuthenticationStateChanged;
await ReloadRequestAuthorization();
}

private async void HandleAuthenticationStateChanged(Task<AuthenticationState> task)
{
_auth = await task;
StateHasChanged();
}

public void Acao(){
Console.WriteLine(_auth.User.Identity.GetId());
}
}


Más, se eu finalizar minha autenticação, esse estado de "conectado" nao muda, fica conectado mesmo eu finalizando a sessão
WEBMASTER 23/02/2023 15:36:10
#501051
Eu registrei no startup.cs do web por conta de uso nas outras camadas...

Startup.cs
services.AddTransient<ILogado, LogadoService>(); 


Injetando na pagina com...
@inject VBMania.BUS.Interfaces.ILogado LogadoService


Usando.

@if (LogadoService.IsLogado())
{
///....
}


E o metodo que de fato verifica o usuario logado

public bool IsLogado()
{
try
{
return _context.HttpContext.User.Identity.IsAuthenticated;
}
catch
{
return false;
}
}
NOWLIGHTS 23/02/2023 16:00:48
#501052
esse _context seria oque? IHttpContextAcessor?
NOWLIGHTS 23/02/2023 16:21:54
#501053
Deu certo, utilizei a mesma lógica e registrei tbm o serviço IHttpContextAcessor;

Citação:

services.AddHttpContextAccessor();
services.AddTransient<ILogadoService, LogadoService>();



Más, continua a questão que; se eu remover o token/coockie da sessão, o blazor entende que ainda estou conectado...

Adicionei o component blazor a tela de login.cshtml para fazer um teste, se eu abro uma tela de login, o estado de conexão é não autenticado, se eu abro outra aba e realizo o login, volto na outra tela de login e dou um F5, o estado muda para conectado, é como se o component blazor estivesse "persistindo no cache as informações"!?

OBS. Estou utilizando o StateHasChange();
NOWLIGHTS 23/02/2023 17:34:37
#501054
Fiz uma gambiarra maneira aqui que funciona hahaha,

No meu Controller de login, adicione o método;

  [Route("/isAuth")]
public async Task<IActionResult> IsAuthenticated()
=> Ok(User.Identity.IsAuthenticated);


criei uma função em javascript;

  async function isAuth() {
const result = await $.ajax({
url: "/isAuth"
}).done(function (r) {
console.log(r);
return r;
}).fail(function (r) {
console.log("not authenticated")
return false;
})
return result;
}


e no blazor;

  bool result = await JsRuntime.InvokeAsync<bool>("isAuth"); 


se eu removo o cookie da autenticação, ou finalizo a sessão, o retorno do JS vem sempre atualizado!
Faça seu login para responder