Hola, soy  José Antonio Pérez-Ruibal  alumno del Centro de Formación Tajamar y estoy cursando el modulo de Certificación MCSD Web Applications. En este Blog os voy a explicar el funcionamiento de Filtros en  un patrón de Arquitectura MVC en la aplicación Visual Studio.

Antes que de implementarlo en un ejercicio práctico, os voy a detallar el funcionamiento básico de los filtros ó Action Filter.

Que es un Filtro?

En MVC un Filtro es un Atributo. Se pueden crear varios filtros a la vez.

Un  Filtro hereda de la clase Base: FilterAttribute.

Puede ser aplicado en un Controlador (Controller), y permite ejecutar código antes o después que se ejecute una acción en el controlador:

[FiltrosAcceso]

public class HomeController : Controller

{public ActionResult Index()

{return View();

}}

Puede ser aplicado en una Acción Particular (Action Result) :

[FiltrosAcceso]

public ActionResult Index()

{return View();}

Puede ser aplicado como un filtro Global:  Añadiendo la clase en  App_Start\FilterConfig.cs

public class FilterConfig

{public static void RegisterGlobalFilters(GlobalFilterCollection filters)

{filters.Add(new HandleErrorAttribute());

filters.Add(new FiltrosAcceso());

}}}

Para que se Utilizan?

Los Filtros se utilizan para inyectar una lógica adicional en el procesamiento de solicitudes MVC.

DIAPOSITIVA :  Los Filtros se aplican en el siguiente orden

 

Tipos de Filtros:

Filtros de Autorización. Implementan la Interfaz:  IAuthorizationFilter, estos filtros se ejecutan primero que cualquier otro filtro. Por ejemplo las clases  AuthorizeAttribute y la clase RequireHttpsAttribute.

Filtros de Acción. Implementan interfaz IActionFilter. Se ejecuta antes y después de un     Método de Acción (ActionResult). La interfaz declara dos métodos: :

OnActionExecuting y OnActionExecuted.

  • OnActionExecuting se ejecuta antes del ActionResult.
  • OnActionExecuted se ejecuta después ActionResult  y puede llevar a cabo procesos adicionales, como proporcionar datos extra al ActionResult, inspeccionar el valor devuelto o cancelar la ejecución del ActionResult.

Filtros de Resultado. Implementan la interfaz IResultFilter. Se ejecuta antes y después  del resultado de un método ActionResult ya ejecutado. La interfaz declara dos métodos: OnResultExecuting y OnResultExecuted.

  • OnResultExecuting se ejecuta antes del resultado de un ActionResult.
  • OnResultExecuted se ejecuta después del resultado y puede llevar a cabo procesos adicionales del resultado, como modificar la respuesta HTTP. La clase OutputCacheAttribute es un ejemplo de un filtro de resultado.

 

Filtros de Excepción. Implementan IExceptionFilter.  Se ejecuta solo si el método de Acción u otro Filtro lanza una excepción.

 

Ejemplo de Filtros en VS MVC en Github.com

https://github.com/jperezaguila/protaj365.git

  

Desarrollo de Ejercicio Practico

Ejemplo de Filtro de Acción:

El objetivo de nuestra aplicación: Permita o deniegue el acceso a una Vista, obteniendo nuestra dirección IP y comparándola con un listado direcciones IP’s que serán guardadas en el Web.config ó en un fichero XML.

Seguir los siguientes pasos:

Creación del Proyecto:

 Click en File/New/Project…

 Seleccionar Insalled/Templates/Visual C#/Web  y seleccionar ASP.NET Web Application

-Name: El Nombre del el proyecto.

 Select a Template:

Empty

Add  folders  and core references for: MVC

Ok

Vea imagen de creación de proyecto 1

Vea imagen de creación de proyecto 2

Vea imagen de creación de proyecto 3

Configuración del Web.config:

Hemos añadido una línea  al Web.config del proyecto <add value… para indicar un listado de IP’s permitidas de acceso a la aplicación, con el nombre de “AccessList”.

<appSettings>
<add key=”webpages:Version” value=”3.0.0.0″ />
<add key=”webpages:Enabled” value=”false” />
<add key=”ClientValidationEnabled” value=”true” />
<add key=”UnobtrusiveJavaScriptEnabled” value=”true” />
<add value =”192.168.10.102″ key=”AccessList”/>
</appSettings>

 

Contenido de HomeController.cs :

Este controller lo hemos creado con Scaffolding, y hemos añadido el filtro antes de nuestro de método de Acción, de esta manera forzaremos a que se ejecute nuestro filtro antes que se ejecute el Action Result.

namespace WebApplicationFiltros.Controllers

{public class HomeController : Controller

{    [FiltrosAcceso]

public ActionResult Index()

{return View();}

}}

 

Contenido de la clase FiltrosAcceso :

Contenido del Código

namespace WebApplicationFiltros.Filtros

{public class FiltrosAcceso : ActionFilterAttribute

{public override void OnActionExecuting(ActionExecutingContext filterContext)

{//string clientip = filterContext.HttpContext.Request.UserHostAddress;

string clientip = GetIP.GetIP4Address();

if (!AddIp(clientip.Trim()))

{filterContext.Result = new HttpStatusCodeResult(403);

}base.OnActionExecuting(filterContext);

}public bool AddIp(string clientip)

{string[] clientipconvert = clientip.Trim().Split(new char[] { ‘.’ });

string iplist = Convert.ToString(ConfigurationManager.AppSettings[“AccessList”]);

string[] ipaccesslist = iplist.Trim().Split(new char[] { ‘,’ });

foreach (var ipaccesslists in ipaccesslist)

{if (ipaccesslists.Trim() == clientip)

{return true;}

string[] validclientip = ipaccesslists.Trim().Split(new char[] { ‘.’ });

bool result = true;

for (int i = 0; i < validclientip.Length; i++)

{if (validclientip[i] != “*”)

{if (validclientip[i] != clientipconvert[i])

{result = false;

break;

}}}

if (result)

{return true;

}}return false;

}}}

Contenido de la clase GetIP:

Previamente se ha añadido la siguiente referencia a nuestro proyecto:

System.Net;

Esta clase ha sido creada en la carpeta Utils y es la encargada de obtener la dirección IP de nuestro equipo, puesto que la propiedad en UserHostAddress nos devuelve la dirección IP de Loopback. Esto sucede en ciertos Sistemas Operativos, en mi caso Windows7 .  Cuando el protocolo IPv4 es el único protocolo habilitado, éste devolverá una dirección IPv4. Sin embargo, si IPv6 está habilitado, tendrá preferencia sobre IPv4  y nuestro código devolverá un dirección IPv6.

public class GetIP

{public static string GetIP4Address()

{string IP4Address = String.Empty;

foreach (IPAddress IPA in Dns.GetHostAddresses(HttpContext.Current.Request.UserHostAddress))

{if (IPA.AddressFamily.ToString() == “InterNetwork”)

{IP4Address = IPA.ToString();

break;

}}

if (IP4Address != String.Empty)

{return IP4Address;

}foreach (IPAddress IPA in Dns.GetHostAddresses(Dns.GetHostName()))

{if (IPA.AddressFamily.ToString() == “InterNetwork”)

{IP4Address = IPA.ToString();

break;

}}

return IP4Address;

}}

 

Contenido de la Vista Index:

@{ViewBag.Title = “Index”;}

<h2>Index</h2>

<h3>Cliente Autorizado</h3>

 

Donde configurar direcciones en PC:

C:\Windows\System32\drivers\etc

Imagen fichero hosts

 

Puede descargar el código en GitHub:

https://github.com/jperezaguila/protaj365ActionFilter.git

 

Autor: Jose Antonio Perez-Ruibal Del Aguila.

Máster de FP. Certificación oficial Microsoft
MCSD Web Applications + SharePoint Applications

2015-2016

Tajamar