Estou tendo problemas com o AntiForgeryToken com ajax. Estou usando o ASP.NET MVC 3. Tentei a solução nas chamadas do jQuery Ajax e no Html.AntiForgeryToken () . Usando essa solução, o token agora está sendo passado:
var data = { ... } // with token, key is '__RequestVerificationToken'
$.ajax({
type: "POST",
data: data,
datatype: "json",
traditional: true,
contentType: "application/json; charset=utf-8",
url: myURL,
success: function (response) {
...
},
error: function (response) {
...
}
});
Quando removo o [ValidateAntiForgeryToken]
atributo apenas para ver se os dados (com o token) estão sendo passados como parâmetros para o controlador, posso ver que eles estão sendo passados. Mas, por algum motivo, a A required anti-forgery token was not supplied or was invalid.
mensagem ainda aparece quando eu coloco o atributo de volta.
Alguma ideia?
EDITAR
O token antiforgery está sendo gerado dentro de um formulário, mas não estou usando uma ação de envio para enviá-lo. Em vez disso, estou apenas obtendo o valor do token usando jquery e depois tentando postá-lo no ajax.
Aqui está o formulário que contém o token e está localizado na página principal do topo:
<form id="__AjaxAntiForgeryForm" action="#" method="post">
@Html.AntiForgeryToken()
</form>
fonte
contentType
aapplication/json
porque o servidor está esperando o__RequestVerificationToken
parâmetro a ser parte da carga útil solicitação POST usandoapplication/x-www-form-urlencoded
.$(this).data('url'),
pode entender qual seria o URL do meu controlador e ação. Por favor explique. graçasOutra abordagem (menos javascript), que eu fiz, é mais ou menos assim:
Primeiro, um ajudante de HTML
que retornará uma string
para que possamos usá-lo assim
E parece que funciona!
fonte
@Html.AntiForgeryTokenForAjaxPost
em dois para obter o nome do token em uma mão e seu valor na outra. Caso contrário, o destaque da sintaxe estará todo bagunçado. Ele acaba assim (removeu as aspas simples do resultado retornado também, para que ele se comporta como qualquer ajudante MVC, por exemplo @url):'@Html.AntiForgeryTokenName' : '@Html.AntiForgeryTokenValue'
XElement.Parse(antiForgeryInputTag).Attribute("value").Value
var antiForgeryInputTag = helper.AntiForgeryToken().ToString(); return XElement.Parse(antiForgeryInputTag).Attribute("value").Value
é tão simples! Quando você usa
@Html.AntiForgeryToken()
seu código html, significa que o servidor assinou esta página e cada solicitação enviada ao servidor a partir dessa página específica tem um sinal impedido de enviar uma solicitação falsa por hackers. portanto, para que esta página seja autenticada pelo servidor, você deve seguir duas etapas:1. envie um parâmetro chamado
__RequestVerificationToken
e para obter seu valor, use os códigos abaixo:por exemplo, faça uma chamada ajax
e a etapa 2 apenas decore seu método de ação
[ValidateAntiForgeryToken]
fonte
No Asp.Net Core, você pode solicitar o token diretamente, conforme documentado :
E use-o em javascript:
Você pode adicionar o filtro global recomendado, conforme documentado :
Atualizar
A solução acima funciona em scripts que fazem parte do .cshtml. Se não for esse o caso, não será possível usá-lo diretamente. Minha solução foi usar um campo oculto para armazenar o valor primeiro.
Minha solução alternativa, ainda usando
GetAntiXsrfRequestToken
:Quando não há forma:
O
name
atributo pode ser omitido desde que eu o useid
.Cada formulário inclui esse token. Portanto, em vez de adicionar mais uma cópia do mesmo token em um campo oculto, você também pode procurar por um campo existente por
name
. Observe: pode haver vários formulários dentro de um documento, portanto,name
nesse caso, não é exclusivo. Ao contrário de umid
atributo que deve ser exclusivo.No script, encontre por id:
Uma alternativa, sem precisar fazer referência ao token, é enviar o formulário com script.
Formulário de exemplo:
O token é adicionado automaticamente ao formulário como um campo oculto:
E envie no script:
Ou usando um método de postagem:
fonte
No Asp.Net MVC, quando você usa o
@Html.AntiForgeryToken()
Razor, cria um campo de entrada oculto com o nome__RequestVerificationToken
para armazenar tokens. Se você deseja escrever uma implementação AJAX, é necessário buscar esse token e passá-lo como parâmetro ao servidor para que possa ser validado.Etapa 1: obter o token
Etapa 2: passe o token na chamada AJAX
Nota : O tipo de conteúdo deve ser
'application/x-www-form-urlencoded; charset=utf-8'
Fiz upload do projeto no Github; você pode baixar e experimentar.
https://github.com/lambda2016/AjaxValidateAntiForgeryToken
fonte
fonte
Eu sei que esta é uma pergunta antiga. Mas vou adicionar minha resposta de qualquer maneira, pode ajudar alguém como eu.
Se você não quiser processar o resultado da ação posterior do controlador, como chamar o
LoggOff
método deAccounts
controlador, faça o seguinte: a seguinte versão da resposta de @DarinDimitrov:fonte
No controlador de conta:
Em vista:
É importante conjunto
contentType
para'application/x-www-form-urlencoded; charset=utf-8'
ou apenas omitircontentType
do objeto ...fonte
Eu tentei muitas soluções alternativas e nenhuma delas funcionou para mim. A exceção foi "O campo obrigatório do formulário anti-falsificação" __RequestVerificationToken ".
O que me ajudou foi mudar o formato .ajax para .post:
fonte
Sinta-se livre para usar a função abaixo:
}
fonte
O token não funcionará se tiver sido fornecido por um controlador diferente. Por exemplo, não funcionará se a visualização foi retornada pelo
Accounts
controlador, mas vocêPOST
para oClients
controlador.fonte