OBTER USUARIO LOGADO EM UM COMPONENT BLAZOR
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;
Más, se eu finalizar minha autenticação, esse estado de "conectado" nao muda, fica conectado mesmo eu finalizando a sessão
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
Eu registrei no startup.cs do web por conta de uso nas outras camadas...
Startup.cs
Injetando na pagina com...
Usando.
E o metodo que de fato verifica o usuario logado
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;
}
}
esse _context seria oque? IHttpContextAcessor?
Deu certo, utilizei a mesma lógica e registrei tbm o serviço IHttpContextAcessor;
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();
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();
Fiz uma gambiarra maneira aqui que funciona hahaha,
No meu Controller de login, adicione o método;
criei uma função em javascript;
e no blazor;
se eu removo o cookie da autenticação, ou finalizo a sessão, o retorno do JS vem sempre atualizado!
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