API da Web 2, autenticação OWIN, logout não efetua logout
Estou fazendo uma pesquisa para trabalhar com o objetivo de usar tokens do Bearer como um mecanismo de autenticação (ou seja, AngularJS UI, autentica via OWIN em um projeto de API da Web [2]).
Eu tenho o login funcionando bem, informações de função e tudo bem, mas não consigo fazer o token sair.
Minha configuração de inicialização é esta:
OAuthOptions = new OAuthAuthorizationServerOptions() {
TokenEndpointPath = new PathString("/Token"),
Provider = new ApplicationOAuthProvider(PublicClientId),
AccessTokenExpireTimeSpan = SESSION_TIMEOUT,
AllowInsecureHttp = true
};
E minha ação de logout é simplesmente esta:
public HttpResponseMessage Logout() {
var authentication = HttpContext.Current.GetOwinContext().Authentication;
authentication.SignOut(DefaultAuthenticationTypes.ExternalBearer);
return new HttpResponseMessage(HttpStatusCode.OK);
}
Deixei todo o material de autenticação por questões de brevidade, mas para confirmar que estou usandoExternalBearer ao configurar o token.
Na minha interface do usuário, estou armazenando o token no armazenamento local (nenhum cookie está envolvido aqui, o que é uma decisão deliberada de design). Então eu tenho umsair botão na minha interface do usuário, oSair ação é atingida e o código funciona bem.
No entanto, se eu clicar posteriormente em uma ação na API que requer autorização, a solicitação ainda será processada (ou seja, o usuário ainda será autenticado, mesmo quedevemos foram desconectados.
Ou estou sentindo falta de algo realmente óbvio (não seria a primeira vez ;-) ou há algo mais fundamental acontecendo aqui - finalmente, estou pingando @leastprivilege, pois sei que essa é a área deles.
Qualquer ajuda ou insight seria recebido com gratidão.
A única coisa em que consigo pensar é que o token é sem estado no lado do servidor / API e, portanto, não pode ser expirado ou desconectado.
Se for esse o caso, acho que eu poderia:
a) Adicione um token de atualização que crie um novo token que expira no passado - isso funcionaria? - na verdade, cancele isso, emitiria um novo token ... o antigo ainda seria válido
b) Armazene o token do portador no banco de dados e verifique cada vez, removendo o token no logout (salgado naturalmente, com hash, etc.). No entanto, isso está nos trazendo de volta a um servidor com estado.
c) Posso (e vou) remover o token do armazenamento local quando alguém fizer logout explicitamente; no entanto, o token ainda é tecnicamente válido seum malvado pode interceptar o token. Naturalmente, todos os itens acima terminaramSSL de qualquer maneira, o que deve inibir abandidos / meninas.
d) Talvez seja por isso que muitas pessoas estejam armazenando o token do portador em um cookie (como um mecanismo de armazenamento); assim que você fizer o logout, pelo menos, o cookie será removido na próxima atualização.
Desculpe, o exposto acima é um pouco de despejo cerebral, apenas querendo antecipar qualquer dúvida