Detectar peticiones Ajax en ASP.net MVC6

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

COMPARTE ESTE ARTÍCULO

ENVIAR A UN AMIGO
COMPARTIR EN FACEBOOK
COMPARTIR EN TWITTER
COMPARTIR EN GOOGLE +
¡SÉ EL PRIMERO EN COMENTAR!
Conéctate o Regístrate para dejar tu comentario.