En las aplicaciones web de hoy en día, hay una total dependencia del lenguaje Javascript y se usa todo el tiempo para el manejo de todo tipo de comportamientos (utilización de frameworks, carga y manipulación de elementos DOM, etc.). Muchas veces, puede sernos útil para determinar la forma específica que las solicitudes entran en nuestra aplicación y definir su origen para que puedas limitar a lo que un usuario puede y no puede acceder a través de peticiones GET y POST llanas.
IsAjaxRequest () = false;
Anteriormente, las aplicaciones ASP.NET MVC podían comprobar fácilmente si la solicitud se hacía a través de AJAX con el método bien llamado IsAjaxRequest(), un método disponible en el objeto Request como puedes ver a continuación:
public ActionResult YourActionName()
{
// Check if the request is an AJAX call
var isAjax = Request.IsAjaxRequest();
// Do something about it.
}
Un ejemplo más común para esto podría ser la de construir un ActionFilter que se pueda aplicar fácilmente como un atributo para permitir solicitudes que vienen a través de AJAX:
[AjaxOnly]
public ActionResult YourActionName()
{
// Omitido por brevedad
}
Antiguas versiones de MVC3 tenían este atributo ya incorporado, por lo tanto si lo quieres poner en práctica, podrías utilizar simplemente algo así como:
public class AjaxOnlyAttribute : ActionFilterAttribute
{
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
if (!filterContext.HttpContext.Request.IsAjaxRequest())
{
filterContext.Result = new HttpNotFoundResult();
}
}
}
Sin embargo, como uno de los muchos cambios radicales que llegaron debido al lanzamiento de MVC6, verás que este método ya no existe.
[AjaxOnly] en MVC6
El IsAjaxRequest() actualmente funciona simplemente realizando un chequeo del X-Requested-With header como se ve puede ver en la actual implementación de la funcion de MV5:
public static bool IsAjaxRequest(this HttpRequestBase request)
{
if (request == null)
throw new ArgumentNullException("request");
if (request["X-Requested-With"] == "XMLHttpRequest")
return true;
if (request.Headers != null)
return request.Headers["X-Requested-With"] == "XMLHttpRequest";
return false;
}
Ahora que ya varios de los parámetros relacionados han cambiado con MVC 6, la implementación de un atributo [AjaxOnly] tendría que cambiar un poco:
public class AjaxOnlyAttribute : ActionMethodSelectorAttribute
{
public override bool IsValidForRequest(RouteContext routeContext, ActionDescriptor action)
{
return routeContext.HttpContext.Request?.Headers["X-Requested-With"] == "XMLHttpRequest";
}
}
Y básicamente eso es todo, puedes simplemente utilizar el atributo [AjaxOnly] en cualquiera de las solicitudes existentes en tu proyecto web y podrás permitir/negar peticiones basándote en si son originarias de AJAX o no.
Por nuestra parte nada más, ya sabes que nos puedes enviar tus propios tutoriales a través de la intranet de la página, o bien proponernos otros temas haciendo uso de los comentarios de más abajo. Un saludo y feliz Halloween.
Fuente: Rion Williams
