Estou criando um aplicativo de página única e tendo um problema com os tokens anti-falsificação.
Sei por que o problema acontece, simplesmente não sei como corrigi-lo.
Recebo o erro quando acontece o seguinte:
- O usuário não conectado carrega uma caixa de diálogo (com um token antifalsificação gerado)
- Usuário fecha a caixa de diálogo
- Usuário faz login
- Usuário abre a mesma caixa de diálogo
- Usuário envia formulário na caixa de diálogo
O token anti-falsificação destina-se ao usuário "", mas o usuário atual é "nome de usuário"
A razão pela qual isso acontece é que meu aplicativo é 100% de página única e, quando um usuário efetua login com êxito em uma postagem do ajax /Account/JsonLogin
, simplesmente troco as visualizações atuais com as "visualizações autenticadas" retornadas do servidor, mas não recarrego o página.
Sei que esse é o motivo, porque se eu simplesmente recarregar a página entre as etapas 3 e 4, não haverá erro.
Portanto, parece que @Html.AntiForgeryToken()
no formulário carregado ainda retorna um token para o usuário antigo até que a página seja recarregada.
Como posso alterar @Html.AntiForgeryToken()
para retornar um token para o novo usuário autenticado?
Eu injeto um novo GenericalPrincipal
com um costume IIdentity
de cada Application_AuthenticateRequest
vez que @Html.AntiForgeryToken()
é chamado HttpContext.Current.User.Identity
, na verdade, minha identidade personalizada com IsAuthenticated
propriedade definida como true e ainda @Html.AntiForgeryToken
assim parece render um token para o usuário antigo, a menos que eu recarregue a página.
fonte
Respostas:
Isso está acontecendo porque o token antifalsificação incorpora o nome de usuário do usuário como parte do token criptografado para melhor validação. Quando você chama pela primeira vez
@Html.AntiForgeryToken()
o usuário não está conectado, o token terá uma sequência vazia para o nome de usuário. Depois que o usuário efetuar login, se você não substituir o token antifalsificação, ele não passará na validação porque o token inicial era para usuário anônimo e agora temos um usuário autenticado com um nome de usuário conhecido.Você tem algumas opções para resolver esse problema:
Desta vez, deixe seu SPA fazer um POST completo e, quando a página for recarregada, ele terá um token antifalsificação com o nome de usuário atualizado incorporado.
Tenha uma visão parcial
@Html.AntiForgeryToken()
logo após o login, faça outra solicitação AJAX e substitua seu token antifalsificação existente pela resposta da solicitação.Apenas desative a verificação de identidade que a validação antifalsificação executa. Adicione o seguinte ao seu Application_Start método:
AntiForgeryConfig.SuppressIdentityHeuristicChecks = true
.fonte
Para corrigir o erro, você precisa colocar a
OutputCache
anotação de dados na página ObterActionResult
logon como:fonte
Isso acontece muitas vezes com meu aplicativo, então decidi pesquisar no Google!
Encontrei uma explicação simples sobre esse erro! O usuário está clicando duas vezes no botão para fazer login! Você pode ver outro usuário falando sobre isso no link abaixo:
O token anti-falsificação fornecido pelo MVC 4 foi destinado ao usuário "", mas o usuário atual é "usuário"
Espero que ajude! =)
fonte
Eu tinha o mesmo problema, e esse truque sujo o corrigiu, pelo menos até que eu possa consertá-lo de uma maneira mais limpa.
...
fonte
A mensagem aparece quando você faz o login quando já está autenticado.
Este auxiliar faz exatamente a mesma coisa que
[ValidateAntiForgeryToken]
atributo.Remova a
[ValidateAntiForgeryToken]
atribuição do controlador e coloque esse auxiliar no método de ação.Portanto, quando o usuário já estiver autenticado, redirecione para a página inicial ou, caso contrário, continue com a verificação do token anti-falsificação válido após essa verificação.
fonte
Eu tenho a mesma exceção que ocorre na maioria das vezes no servidor de produção.
Por que isso acontece?
Isso acontece quando o usuário faz login com credenciais válidas e, uma vez logado e redirecionado para outra página, e depois que eles pressionam o botão Voltar, a página de login é exibida e, novamente, ele inseriu credenciais válidas no momento em que essa exceção ocorrerá.
Como resolver?
Basta adicionar esta linha e funcionar perfeitamente, sem erros.
fonte
Eu tive um problema bastante específico, mas similar, dentro do processo de registro. Depois que o usuário clica no link de e-mail enviado a ele, ele é conectado e enviado diretamente para a tela de detalhes da conta para preencher mais algumas informações. Meu código era:
Descobri que a exibição de retorno ("AccountDetails") estava me dando a exceção do token, acho que porque a função ConfirmEmail foi decorada com AllowAnonymous, mas a função AccountDetails tinha ValidateAntiForgeryToken.
Alterar o retorno para retornar RedirectToAction ("AccountDetails") resolveu o problema para mim.
fonte
Você pode testar isso colocando um ponto de interrupção na primeira linha da sua ação de Login (Obter). Antes de adicionar a diretiva OutputCache, o ponto de interrupção seria atingido na primeira carga, mas depois de clicar no botão voltar do navegador, não seria. Depois de adicionar a diretiva, você deve acabar com o ponto de interrupção sempre, para que o AntiForgeryToken seja o correto, e não o vazio.
fonte
Eu tive o mesmo problema com um aplicativo ASP.NET MVC Core de página única. Eu o resolvi definindo
HttpContext.User
em todas as ações do controlador que alteram as declarações de identidade atuais (já que o MVC faz isso apenas para solicitações subsequentes, conforme discutido aqui ). Usei um filtro de resultados em vez do middleware para anexar os cookies antiforgery às minhas respostas, o que garantiu que eles fossem gerados somente após o retorno da ação MVC.Controller (NB. Estou gerenciando usuários com o ASP.NET Core Identity):
Filtro de resultados para anexar cookies antiforgery:
Extrato Startup.cs:
fonte
Tem um problema com a validação de token anti-falsificação na loja virtual: os usuários abrem muitas guias (com mercadorias) e, depois de fazer logon em uma, tentam fazer logon em outra e obtêm essa AntiForgeryException. Portanto, AntiForgeryConfig.SuppressIdentityHeuristicChecks = true não me ajudou, então eu usei esse hackfix feio, talvez seja útil para alguém:
Acho que será ótimo se as opções de geração de token anti-falsificação puderem ser definidas, para excluir nome de usuário ou algo assim.
fonte