Identity Server 4 - Logout

  • Rafael Miceli
  • 3 Mai 2016

Uma vez que temos nossa aplicação usando nosso Authorization Server para acessar áreas privadas da nossa aplicação, vamos implementar a funcionalidade para realizar logout do mesmo.

Lembrando que todos os código de exemplo deste post estão em meu Github

Logout no Client

Em nossa aplicação Client vamos criar um botão de logout no menu que se encontra no caminho Views/Shared/_Layout.cshtml:

passo1

Excelente! Agora nos logamos nosso botão de logout aparece, mas ainda não faz nada. Vamos criar uma Action para nosso Logout em nosso HomeController, e nessa Action vamos implementar o seguinte código:

[Authorize]
public async Task<IActionResult> Logout()
{
    await HttpContext.Authentication.SignOutAsync("cookies");
    return Redirect("~/");
}

Muito bom! Mas… Se notar, ao realizarmos o logout, tudo parece ter ocorrido ok. Nossa opção de Logout do menu some, tudo certo… Porém, quando clicamos na área restrita (Contact nesse caso) repare que não nos pede o login novamente! E a opção Logout volta aparecer.

Explicando melhor, o trecho do código:

await HttpContext.Authentication.SignOutAsync("cookies");

Apenas realiza Logout em nossa aplicação CLIENT, mas em nosso Authorization Server nós continuamos logado!

Então, como resolver isso? Vou mostrar uma maneira, mas vou melhorar ela depois.

Logout no Authorization Server

Se quisermos que nossa aplicação ao realizar Logout nela, também realize em nosso Auth Server a forma mais rápida é no Redirect da nossa Action de Logout apontarmos para o logout em nosso Authorization Server (Esse era o comportamento padrão no Identity Server 3).

Vamos fazer isso mudando nossa Action de Logout da seguinte maneira:

[Authorize]
public async Task<IActionResult> Logout()
{
    await HttpContext.Authentication.SignOutAsync("cookies");
    return Redirect("http://localhost:5000/ui/logout");
}

Excelente! Nossa aplicação realiza Logout, e depois somo redirecionados a realizar o Logout no Indetity Server, mas ainda não somos redirecionados a nossa aplicação. Em nosso próximo post vamos melhorar isso mais.

comentarios com Disqus Disqus