Pergunta

Estou tentando implementar uma funcionalidade de login "Lembre -me de mim" para um site do ASP.NET MVC que estou construindo. Estou tentando usar esta abordagem http://jaspan.com/improved_persistent_login_cookie_best_practice (Veja 'Miller's Design' perto de topo) e faça com que ele trabalhe até certo ponto.

Assim, o fluxo de trabalho é:

  1. O usuário faz login e recebe uma string aleatória criptograficamente segura + seu ID do banco de dados como um cookie persistente (com duração de cerca de 30 dias). A sequência segura é armazenada no banco de dados ao lado do registro da conta de usuário.
  2. Mais tarde, o usuário volta ao site, onde o navegador apresenta o cookie de login, a tecla ID e segura é procurada no banco de dados e, se a correspondência for encontrada, o usuário será automaticamente autenticado.
  3. Uma vez autenticado, uma nova chave segura é gerada, armazenada no banco de dados e no novo cookie emitido.

Eu tenho isso funcionando bem, no entanto, não funciona muito bem se o usuário fizer login a partir de vários navegadores ou computadores. Obviamente, os navegadores diferentes acabarão com uma chave segura diferente armazenada como biscoito, assim o fluxo de trabalho se torna:

  1. O usuário faz login no navegador A, é emitido uma chave segura como cookie, a tecla é armazenada no banco de dados.
  2. O usuário faz login no navegador B, recebe uma chave segura diferente como cookie. A chave também é armazenada no banco de dados, mas substitui a chave gerada pelo navegador A.
  3. O site visita o site do navegador A novamente, o navegador apresenta o cookie emitido da etapa 1. Mas ele não corresponde mais porque a tecla Segura foi substituída na etapa 2. Portanto, o usuário precisa fazer login novamente. Outra nova chave é gerada e substitui a chave emitida ao navegador B.
  4. Os usuários visitas do navegador B novamente, a chave não corresponde, precisa fazer login novamente etc. etc.

Como faço para resolver isso? Preciso armazenar e manter várias chaves no banco de dados? Eu estou fazendo isso da maneira certa? Percebi que o StackOverflow parece gerenciar isso e me lembra de diferentes navegadores e computadores.

Foi útil?

Solução

Ao ler o artigo que você vinculou, parece-me que o design de Miller é armazenar a string aleatória e o nome de usuário como um par em uma tabela diferente da tabela de usuários. Usando a string aleatória como índice, você pode ter vários logins simultâneos do mesmo nome de usuário, ainda sendo razoavelmente bem protegidos pelo seqüestro de sessão.

Sua descrição indica que você armazena a string aleatória dentro da tabela de usuários, o que permitiria apenas um login no momento.

Outras dicas

Você precisa de um terceiro item em seu cookie, um token de 'série'. Isso representará um evento de login. Toda vez que o usuário faz login no seu sistema, ele cria uma nova série, que não muda até que eles façam logout ou login novamente. Você ainda tem seu token, ou seja, a chave garantida, que está atualizando em todas as solicitações.

Aqui estão alguns links para ajudar com esta implementação:

Problemas de banco de dados ao permitir vários logs persistentes do navegador

O guia definitivo para a autenticação do site baseada em formulário

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top