Estoy usando Membership.create
la función de usuario, entonces ocurre el siguiente error,
El campo de formulario antifalsificación requerido "__RequestVerificationToken" no está presente
¿Cómo puedo arreglar esto?
Estoy usando Membership.create
la función de usuario, entonces ocurre el siguiente error,
El campo de formulario antifalsificación requerido "__RequestVerificationToken" no está presente
¿Cómo puedo arreglar esto?
Respuestas:
Tienes [ValidateAntiForgeryToken]
atributo antes de tu acción. También debe agregar @Html.AntiForgeryToken()
su formulario.
Html.AntiForgeryToken();
No funciona !! Convirtiéndose en @Html.AntiForgeryToken()
obras
En mi caso, tuve esto en mi web.config:
<httpCookies requireSSL="true" />
Pero mi proyecto estaba configurado para no usar SSL. Al comentar esa línea o configurar el proyecto para usar siempre SSL, se resolvió.
IIS
hubo un enlace ( https » EmptyHostName » IP » 443
) pero no hubo un enlace para ( https » www.mysite.com » IP » 443
). Así que agregué un nuevo enlace con un nombre de host no vacío para https
eso era igual al dominio y resolvió el problema. He reescrito la configuración IIS
para forzar http 2 https
también.
Me gusta esto:
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult MethodName(FormCollection formCollection)
{
...
Code Block
...
}
@using(Html.BeginForm())
{
@Html.AntiForgeryToken()
<input name="..." type="text" />
// rest
}
También asegúrese de evitar no usar [ValidateAntiForgeryToken] en [HttpGet].
[HttpGet]
public ActionResult MethodName()
{
..
}
Recibirá el error incluso cuando las Cookies no estén habilitadas.
Otra cosa que puede causar esto (solo me encontré con esto) es la siguiente: si por alguna razón deshabilita todos los campos de entrada en su formulario. deshabilitará el campo de entrada oculto que contiene su token de verificación. cuando el formulario se regrese, el valor del token faltará y generará el error que falta. Entonces, lo que debe hacer es volver a habilitar el campo de entrada que contiene el token de verificación y todo estará bien.
Otra posibilidad para quienes cargamos archivos como parte de la solicitud. Si la longitud del contenido excede <httpRuntime maxRequestLength="size in kilo bytes" />
y está utilizando tokens de verificación de solicitud, el navegador muestra el 'The required anti-forgery form field "__RequestVerificationToken" is not present'
mensaje en lugar del mensaje de longitud excedida de la solicitud.
Establecer maxRequestLength en un valor lo suficientemente grande como para atender la solicitud cura el problema inmediato, aunque admitiré que no es una solución adecuada (queremos que el usuario sepa el verdadero problema del tamaño del archivo, no el de los tokens de verificación de solicitud que faltan).
Asegúrese en su controlador de que tiene su atributo http como:
[HttpPost]
también agregue el atributo en el controlador:
[ValidateAntiForgeryToken]
En su formulario en su vista tiene que escribir:
@Html.AntiForgeryToken();
Tenía Html.AntiForgeryToken (); sin el signo @ mientras estaba en un bloque de código, no dio un error en Razor pero sí en tiempo de ejecución. Asegúrese de mirar el signo @ de @ Html.Ant .. si falta o no
En mi caso, tenía este javascript en el formulario de envío:
$('form').submit(function () {
$('input').prop('disabled', true);
});
Esto eliminaba el RequestVerificationToken oculto del formulario que se envía. Lo cambié a:
$('form').submit(function () {
$('input[type=submit]').prop('disabled', true);
$('input[type=text]').prop('readonly', true);
$('input[type=password]').prop('readonly', true);
});
... y funcionó bien.
readonly
y excluí los controles ocultos. Parece funcionar bien.
En mi caso el dominio incorrecto en web.config para cookies fue el motivo:
<httpCookies domain=".wrong.domain.com" />
En mi caso fue debido a la adición requireSSL=true
de httpcookies
en webconfig que hizo que el funcionamiento de la parada AntiForgeryToken. Ejemplo:
<system.web>
<httpCookies httpOnlyCookies="true" requireSSL="true"/>
</system.web>
Para hacer ambas cosas requireSSL=true
y @Html.AntiForgeryToken()
trabajar, agregué esta línea dentro Application_BeginRequest
deGlobal.asax
protected void Application_BeginRequest(object sender, EventArgs e)
{
AntiForgeryConfig.RequireSsl = HttpContext.Current.Request.IsSecureConnection;
}
Recibí este error en Chrome con inicio de sesión predeterminado para ASP.NET con cuentas de usuario individuales
.cshtml:
@using (Html.BeginForm("Login", "Account", new { ReturnUrl = ViewBag.ReturnUrl }, FormMethod.Post, new { @class = "form-horizontal", role = "form" }))
{
@Html.AntiForgeryToken()
<h4>Use a local account to log in.</h4>
Controlador:
[HttpPost]
[AllowAnonymous]
[ValidateAntiForgeryToken]
public async Task<ActionResult> Login(LoginViewModel model, string returnUrl)
Resuelto borrando los datos del sitio para el sitio:
En mi solución EPiServer en varios controladores había un atributo ContentOutputCache en la acción Index que aceptaba HttpGet. Cada vista para esas acciones contenía un formulario que se publicaba en una acción HttpPost en el mismo controlador o en uno diferente. Tan pronto como eliminé ese atributo de todas esas acciones del Índice, el problema desapareció.
Porque esto surge con la primera búsqueda de esto:
Tuve este problema solo en Internet Explorer y no pude averiguar cuál era el problema. En pocas palabras, no estaba guardando la porción de cookie del Token porque nuestro (sub) dominio tenía un guión bajo. Trabajó en Chrome pero a IE / Edge no le gustó.
Todas las otras respuestas aquí también son válidas, pero si ninguna de ellas resuelve el problema, también vale la pena verificar que los encabezados reales se estén pasando al servidor.
Por ejemplo, en un entorno de carga equilibrada detrás de nginx, la configuración predeterminada es eliminar el encabezado __RequestVerificationToken antes de pasar la solicitud al servidor, vea: el proxy inverso nginx simple parece eliminar algunos encabezados
A veces está escribiendo un método de acción de formulario con una lista de resultados. En este caso, no puede trabajar con un método de acción. Por lo tanto, debe tener dos métodos de acción con el mismo nombre. Uno con [HttpGet]
y otro con[HttpPost]
atributo.
En su [HttpPost]
método de acción, establezca el [ValidateAntiForgeryToken]
atributo y también coloque @Html.AntiForgeryToken()
su formulario html.
En mi caso, recibí este error al hacer una publicación AJAX, resultó que el valor __RequestVerificationToken no se pasaba en la llamada. Tuve que encontrar manualmente el valor de este campo y establecerlo como una propiedad en el objeto de datos que se envía al punto final.
es decir
data.__RequestVerificationToken = $('input[name="__RequestVerificationToken"]').val();
HTML
<form id="myForm">
@Html.AntiForgeryToken()
<!-- other input fields -->
<input type="submit" class="submitButton" value="Submit" />
</form>
Javascript
$(document).on('click', '#myForm .submitButton', function () {
var myData = { ... };
myData.__RequestVerificationToken = $('#myForm input[name="__RequestVerificationToken"]').val();
$.ajax({
type: 'POST',
url: myUrl,
data: myData,
contentType: 'application/x-www-form-urlencoded; charset=utf-8',
dataType: 'json',
success: function (response) {
alert('Form submitted');
},
error: function (e) {
console.error('Error submitting form', e);
alert('Error submitting form');
},
});
return false; //prevent form reload
});
Controlador
[HttpPost]
[Route("myUrl")]
[ValidateAntiForgeryToken]
public async Task<ActionResult> MyUrlAsync(MyDto dto)
{
...
}
public class MyDto { public bool Whatever { get; set; } }
Me gustaría compartir el mío, he estado siguiendo este tutorial anti falsificación
usando asp.net mvc 4 con angularjs, pero arroja una excepción cada vez que solicito usar $ http.post y descubrí que la solución es simplemente agregar
'X- Solicitado con ':' XMLHttpRequest ' a los encabezados de $ http.post, porque parece que (filterContext.HttpContext.Request.IsAjaxRequest())
no lo reconoce como ajax y aquí está mi código de ejemplo.
App.js
var headers = {
'X-Requested-With': 'XMLHttpRequest',
'RequestVerificationToken': $scope.token,
'Content-Type': 'application/json; charset=utf-8;'
};
$http({
method: 'POST',
url: baseURL + 'Save/User',
data: JSON.stringify($scope.formData),
headers: headers
}).then(function (values) {
alert(values.data);
}).catch(function (err) {
console.log(err.data);
});
SaveController
[HttpPost]
[MyValidateAntiForgeryToken]
public ActionResult User(UserModel usermodel)
{
....