[ASP.NET Web API] Filtros de validación

Posted on Actualizado enn


Realmente ando muy contento trabajando con Web API, sobretodo por su facilidad de uso, sin embargo, unos de los puntos que debemos tener presente cuando creando servicios REST con Web API es la seguridad y la creación de filtros para no exponer sin consideración las acciones de nuestros servicios, para solucionar dicho problema es posible crear filtros y realizar todas esas validaciones necesarias.

Los filtros pueden ser aplicados en diferentes niveles:

  • A nivel de clase
  • A nivel de acción
  • A nivel global

Para crear un filtro, se debe crear una clase que herede de ActionFilterAttribute y luego sobrescribir el método OnActionExecuting, para ver el tema en acción crearemos un filtro para validar que el dominio del cual están realizando la petición sea conocido, por lo tanto creamos la clase FilterDomainAttribute:

public class FilterDomainAttribute : ActionFilterAttribute
{
	public override void OnActionExecuting(System.Web.Http.Controllers.HttpActionContext actionContext)
	{
		var domain = "dominio";
		if (!string.Equals(actionContext.Request.RequestUri.Host, domain, StringComparison.OrdinalIgnoreCase))
		{
			actionContext.Response = new HttpResponseMessage(HttpStatusCode.Unauthorized)
				{
					Content = new StringContent("Petición no autorizada")
				};
		}
	}
}

Entonces, creamos la clase FilterDomainAttribute la cual hereda de ActionFilterAttribute, luego hacemos un override al método OnActionExecuting y allí lo que hacemos es obtener el dominio con actionContext.Request.RequestUri.Host y se compara en este caso con el valor de la variable domain, en caso de no ser un dominio válido retornamos el mensaje “Petición no autorizada” con el estado de no autorizado HttpStatusCode.Unauthorized.

Ahora, creamos un controller (muy sencillo) para el manejo de clientes, entonces la clase Client:

public class Client
{
	public int ClientId { get; set; }
	public string Name { get; set; }
	public string Twitter { get; set; }
}

Y el controlador:

public class ClientController : ApiController
{
	private readonly IEnumerable<Client> clients = new List<Client>() {
		new Client (){ ClientId = 1, Name = "Julio", Twitter = "@julitogtu"},
		new Client (){ ClientId = 2, Name = "Juan", Twitter = "@JuanKRuiz"},
		new Client (){ ClientId = 3, Name = "Nicolas", Twitter = "@nicolocodev"},

	};

	public IEnumerable<Client> GetAll()
	{
		return clients;
	}

	public Client GetById(int id)
	{
		return new Client() { ClientId = 1, Name = "Julio", Twitter = "@julitogtu" };
	}
}

Para utilizar el filtro a nivel de clase o a nivel de acción lo único que se debe utilizar es decorar bien sea la clase o la acción con el atributo creado (no olvidar referenciar el namespace ActionFilter.Filter):

[FilterDomain]
public class ClientController : ApiController

[FilterDomain]
public IEnumerable GetAll()

Algo interesante es que es posible escribir solo FilterDomain, y recuerden que el nombre de la clase es FilterDomainAttribute.

Y ahora, si se quiere aplicar el filtro a nivel global se debe ir al global.asax y definirlo en el Application_Start:

GlobalConfiguration.Configuration.Filters.Add(new FilterDomainAttribute());

Si quieren ver otros ejemplos relacionados les recomiendo dos post del master Gonzalo:

Les dejo el código del ejemplo: Descarga el ejemplo!

Saludos!

Un comentario sobre “[ASP.NET Web API] Filtros de validación

    […] [ASP.NET Web API] Filtros de validación […]

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s