Tengo problemas con el AntiForgeryToken con ajax. Estoy usando ASP.NET MVC 3. Probé la solución en llamadas jQuery Ajax y Html.AntiForgeryToken () . Usando esa solución, el token ahora se pasa:
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) {
...
}
});
Cuando elimino el [ValidateAntiForgeryToken]
atributo solo para ver si los datos (con el token) se pasan como parámetros al controlador, puedo ver que se pasan. Pero por alguna razón, el A required anti-forgery token was not supplied or was invalid.
mensaje sigue apareciendo cuando devuelvo el atributo.
¿Algunas ideas?
EDITAR
El antiforgerytoken se está generando dentro de un formulario, pero no estoy usando una acción de envío para enviarlo. En cambio, solo obtengo el valor del token usando jquery y luego intento publicarlo en ajax.
Aquí está el formulario que contiene el token y se encuentra en la página maestra superior:
<form id="__AjaxAntiForgeryForm" action="#" method="post">
@Html.AntiForgeryToken()
</form>
fuente
contentType
paraapplication/json
que el servidor está a la espera del__RequestVerificationToken
parámetro a ser parte de la carga útil petición POST usandoapplication/x-www-form-urlencoded
.$(this).data('url'),
puede entender cuál sería la url de mi controlador y acción. por favor explique. graciasOtro enfoque (menos javascript) que hice, es algo así:
Primero, un ayudante HTML
eso devolverá una cadena
para que podamos usarlo así
¡Y parece funcionar!
fuente
@Html.AntiForgeryTokenForAjaxPost
en dos para obtener el nombre del token en una mano y su valor en la otra. De lo contrario, el resaltado de sintaxis está en mal estado. Termina así (también elimina las comillas simples del resultado devuelto, de modo que se comporta como cualquier ayudante de MVC, por ejemplo @Url):'@Html.AntiForgeryTokenName' : '@Html.AntiForgeryTokenValue'
XElement.Parse(antiForgeryInputTag).Attribute("value").Value
var antiForgeryInputTag = helper.AntiForgeryToken().ToString(); return XElement.Parse(antiForgeryInputTag).Attribute("value").Value
¡Es tan simple! cuando lo usa
@Html.AntiForgeryToken()
en su código html significa que el servidor ha firmado esta página y cada solicitud que se envía al servidor desde esta página en particular tiene un signo que los hackers impiden enviar una solicitud falsa. para que el servidor autentique esta página, debe seguir dos pasos:1.Envíe un parámetro llamado
__RequestVerificationToken
y para obtener su valor use los siguientes códigos:por ejemplo tomar una llamada ajax
y el paso 2 simplemente decora tu método de acción
[ValidateAntiForgeryToken]
fuente
En Asp.Net Core puede solicitar el token directamente, como se documenta :
Y úsalo en javascript:
Puede agregar el filtro global recomendado, como se documenta :
Actualizar
La solución anterior funciona en scripts que forman parte de .cshtml. Si este no es el caso, entonces no puede usarlo directamente. Mi solución fue usar un campo oculto para almacenar el valor primero.
Mi solución alternativa, todavía uso
GetAntiXsrfRequestToken
:Cuando no hay forma:
El
name
atributo se puede omitir ya que uso elid
atributo.Cada formulario incluye este token. Entonces, en lugar de agregar otra copia del mismo token en un campo oculto, también puede buscar un campo existente por
name
. Tenga en cuenta: puede haber múltiples formularios dentro de un documento, porname
lo que en ese caso no es único. A diferencia de unid
atributo que debería ser único.En el script, busque por id:
Una alternativa, sin tener que hacer referencia al token, es enviar el formulario con script.
Formulario de muestra:
El token se agrega automáticamente al formulario como un campo oculto:
Y enviar en el script:
O usando un método de publicación:
fuente
En Asp.Net MVC cuando usas
@Html.AntiForgeryToken()
Razor crea un campo de entrada oculto con nombre__RequestVerificationToken
para almacenar tokens. Si desea escribir una implementación AJAX, debe buscar este token usted mismo y pasarlo como un parámetro al servidor para que pueda ser validado.Paso 1: Obtén el token
Paso 2: Pase el token en la llamada AJAX
Nota : El tipo de contenido debe ser
'application/x-www-form-urlencoded; charset=utf-8'
He subido el proyecto en Github; puedes descargarlo y probarlo.
https://github.com/lambda2016/AjaxValidateAntiForgeryToken
fuente
fuente
Sé que esta es una vieja pregunta. Pero agregaré mi respuesta de todos modos, podría ayudar a alguien como yo.
Si no desea procesar el resultado de la acción posterior del controlador, como llamar al
LoggOff
método delAccounts
controlador, puede hacer lo siguiente en la respuesta de @DarinDimitrov:fuente
En el controlador de cuenta:
En vista:
Es importante establecer
contentType
que'application/x-www-form-urlencoded; charset=utf-8'
o simplemente omitircontentType
desde el objeto ...fuente
Probé muchos entornos de trabajo y ninguno de ellos funcionó para mí. La excepción fue "El campo de formulario antifalsificación requerido" __RequestVerificationToken ".
Lo que me ayudó fue cambiar la forma .ajax a .post:
fuente
Siéntase libre de usar la función a continuación:
}
fuente
El token no funcionará si fue suministrado por un controlador diferente. Por ejemplo, no funcionará si el
Accounts
controlador devolvió la vista , sino ustedPOST
alClients
controlador.fuente