Evitar el acceso con navegadores viejos (httpModules .NET)

La gente de Microsoft, en su afán de mejorar la arquitectura de su tecnología web, implementó algo nuevo conocido como httpModules. Obviamente, no es algo nuevo, pero si es algo que se está comenzando a usar hace muy poco tiempo.

La propuesta es muy similar a lo que Java llama Filtros. Básicamente todo request que llegue al servidor, pasaría por estos httpModules quienes harían su trabajo y toman decisiones. Para aquellos que quieren entender de qué estoy hablando en 5 minutos, la idea es muy simple un patrón Observer. Lo que hay que hacer es:

  1. Definir estos módulos (así los bautizó MS) deben estar definidas para escuchar un cierto evento que ocurra con el servidor. Por ejemplo, GET (para ver todo los eventos que se pueden atrapar, ver este link)
  2. Modificar el web.config para agregar ese módulo a la configuración de la aplicación web.
  3. Tener precaución, porque este filtro actuará sobre todo acceso que se realice con el servidor y nos podría ocasionar problemas si queremos redirigir a una página de error, por ejemplo.

En nuestro caso, necesitábamos evitar que navegadores viejos ingresaran a un sitio. Tan simple como eso. Tuvimos que tomar algunas precauciones, pero luego de mucha búsqueda encontramos una solucíon muy satisfactoria con los módulos (y claramente superior a cualquier chanchada). Aquí les adjunto el código para que lo vean (como dice el dicho: El camino se hace rodando)

using System;
using System.Web;
using log4net;

namespace modulos
{
	public class OldBrowserModule : IHttpModule
	{
		#region IHttpModule Members

		public void Init(HttpApplication application)
		{
			application.BeginRequest += new EventHandler(OnBeginRequest);
		}
		public void Dispose() { }
		
		#endregion

		public delegate void MyEventHandler(Object s, EventArgs e);
		private MyEventHandler _eventHandler = null;

		public event MyEventHandler MyEvent
		{
			add { _eventHandler += value; }
			remove { _eventHandler -= value; }
		}

		private bool applyFilter(HttpRequest req)
		{
			bool retVal = true;
			retVal != !(req.FilePath.IndexOf("UnsupportedBrowserGlobal.aspx") > 0);
			retVal != req.FilePath.EndsWith(".aspx");
			return retVal;

		}

		public void OnBeginRequest(Object s, EventArgs e)
		{
			HttpApplication app = (HttpApplication)s;
			HttpRequest req = app.Context.Request;
			if (applyFilter(req))
			{
				if (req.Browser.Browser.Equals("IE") && req.Browser.MajorVersion < 6)
				{
					app.Response.Redirect("~/UnsupportedBrowserGlobal.aspx");
				}
			}
		}

	}
}


Discussion Area - Leave a Comment