La página que estoy construyendo depende en gran medida de AJAX. Básicamente, solo hay una "página" y cada transferencia de datos se maneja a través de AJAX. Como el almacenamiento en caché excesivamente optimista en el lado del navegador provoca problemas extraños (datos no cargados), tengo que realizar todas las solicitudes (también las lecturas) utilizando POST, lo que obliga a volver a cargar.Protección CSRF en solicitudes AJAX usando MVC2
Ahora quiero evitar la página contra CSRF. Con el envío de formularios, usar Html.AntiForgeryToken()
funciona bien, pero en AJAX-request, ¿supongo que tendré que agregar el token manualmente? ¿Hay algo listo para usar disponible?
Mi intento actual se parece a esto:
Me encantaría volver a utilizar la magia existente. Sin embargo, HtmlHelper.GetAntiForgeryTokenAndSetCookie
es privado y no quiero piratear en MVC. La otra opción es escribir una extensión como
public static string PlainAntiForgeryToken(this HtmlHelper helper)
{
// extract the actual field value from the hidden input
return helper.AntiForgeryToken().DoSomeHackyStringActions();
}
que es un poco hacky y deja sin resolver el mayor problema: cómo verificar esa señal? La implementación de verificación predeterminada es interna y está codificada contra el uso de campos de formulario. Traté de escribir un ValidateAntiForgeryTokenAttribute
ligeramente modificado, pero usa un AntiForgeryDataSerializer
que es privado y realmente no quería copiar eso también.
En este punto, parece ser más fácil encontrar una solución de cosecha propia, pero realmente es un código duplicado.
¿Alguna sugerencia de cómo hacerlo de la manera más inteligente? ¿Me estoy perdiendo algo completamente obvio?
Brilliant! ¡Funciona de maravilla! No sé si los campos publicados terminarían en 'Request.Form'. +1 para la declaración de selección muy clara. ¡Aclamaciones! – mnemosyn