ASP.NET Core 1.0 — AntiForgery Ajax

Siguiendo con los posts acerca de ASP.NET Core 1.0 en esta oportunidad veremos cómo implementar Antiforgery en escenarios Ajax para validar la integridad de la información que es enviada por el cliente.

¿Qué es Antiforgery?

Toda aplicación web que reciba POSTs desde el cliente (Ajax o no) es vulnerable a recibir esos POSTs desde orígenes externos, por ejemplo, si alguien “simula” el envío de un formulario que tenemos en nuestra aplicación a través de otro sitio. Esta práctica se denomina CSRF o XSRF (Cross-Site Request Forgery). Desde ASP.NET MVC 3, se incluyó una característica llamada Antiforgery Token que básicamente funciona de la siguiente manera:

  • Se agrega dentro de un FORM la llamada a @Html.AntiforgeryToken()
  • Esto genera un tag INPUT oculto que tiene un Token generado por el servidor
  • El servidor a su vez envía una Cookie al cliente generada en base al Token
  • Cuando el POST se envía del formulario, se valida la existencia del Token y la Cookie en el request y que ambos correspondan

De esta manera, si un agente externo quiere simular el envío del POST queda efectivamente bloqueado por la falta del Token y/o Cookie.

¿Cómo funciona Antiforgery en ASP.NET Core 1.0?

El concepto es el mismo pero hay que seguir el concepto modular de ASP.NET Core, para eso, en nuestro Startup.cs agregamos el servicio:

Luego tenemos dos opciones, o manualmente dentro de nuestros FORMs llamamos a @Html.AntiforgeryToken() o usamos el paquete de TagHelpers de MVC. En este último caso, debemos registrar la dependencia en nuestro project.json:

y podemos en nuestras Views usarlo de la siguiente manera:

En el Controller, bastará con decorar la Action con:

Y eso es todo.

¿Y con Ajax?

El escenario anterior funciona perfecto si estamos enviando el formulario con el resto de la página, pero ¿cómo hacemos si (como en la mayoría de las aplicaciones web actuales) queremos sólo enviar el FORM de forma asíncrona sin refrescar el resto de la página?

Para eso debemos hacer unos ajustes a la implementación anterior, primero, debemos ir a nuestro Startup.cs y agregar:

Donde estaremos definiendo de forma particular, el nombre de la Cookie que es parte del proceso de Antiforgery. Luego, iremos a nuestro código HTML y agregaremos algún tipo de identificador al FORM:

Al enviar el formulario de forma asíncrona, posiblemente estemos usando AngularJS o JQuery, lo que debemos hacer es enviar el valor del AntiForgery en un Header:

De esta manera, estamos enviando el Token en un Header, faltará implementar la validación del lado del servidor. Para eso, creamos un Atributo de la siguiente manera:

Si analizamos un poco el código, el atributo utiliza Inyección de Dependencias para obtener el servicio nativo de Antiforgery de ASP.NET Core en su constructor y validar los valores de la Cookie y del Token.

Si ya hemos trabajado con ASP.NET Core e Inyección de Dependencias, sabemos que para lograr esto, debemos definirlo en Startup.cs, con lo cual quedaría finalmente:

Ahora solo faltará decorar nuestras Actions de la manera:

ServiceFilter nos permite inyectar una instancia del atributo ValidateAjaxAntiForgeryToken definido como Singleton en nuestro Startup.cs en vez de crear una instancia nueva y a su vez permite la inyección de dependencias dentro del atributo.

Espero les haya sido útil y puedan implementar Antiforgery en escenarios Ajax para segurizar sus aplicaciones ASP.NET Core.


Originally published at Twisting code.

One clap, two clap, three clap, forty?

By clapping more or less, you can signal to us which stories really stand out.