viernes, enero 11, 2008

Seguridad a nivel de página en ASP.NET

Buenas a todos, este es uno de los últimos post desde Madrid, y va a tratar sobre seguridad.

Cuando planificamos una aplicación, planificamos también quien va a tener acceso a la aplicacion que estamos desarrollando. La posibilidad más extendida es utilizar el web.config para configurar que usuarios van a poder acceder al site y quienes no.

Sin embargo, aqui vamos a analizar otra posibilidad que permite aplicar una cierta lógica a la autorización, más alla del simple "tú sí", "tú no", más orientada a objetos, pero menos a la escalabilidad que permiten los ficheros de configuración.

Supongamos que tenemos la página Default.aspx, Pagina1.aspx y Página2.aspx, y que quiero que sólo ciertos usuarios puedan acceder a esas páginas. Es un ejemplo simple que se hace facilmente con el web.config. Pero vamos a hacerlo con herencia.

Creamos una clase que se llame BasePage.cs, que herede de Page. Sobreescribimos el evento Init de la página, que nos permitirá ejecutar las acciones que queramos antes si quiera de que se genere el formulario.

La página quedaría así:


public class BasePage : Page
{
public BasePage() { }
protected sealed override void OnInit(EventArgs e)
{
if (!ValidateAccess())

throw new System.Security.Authentication.AuthenticationException();
base.OnInit(e);
}


private bool ValidateAccess()
{
WindowsIdentity identidad = WindowsIdentity.GetCurrent();
return (identidad.Name.Contains("nombreUsuario"));
}
}


Por supuesto, en el método ValidateAccess podríamos meter tanta lógica como quisieramos. Podríamos acceder a base de datos para comprobar si ese usuario tiene permiso para acceder en este momento a esa página, por ejemplo.

A partir de aqui, todas las páginas que hereden de esta clase, ejecutarán esa validación en el Init. Además, puesto que hemos incorporado la clausula "sealed", las páginas que hereden de nuestra clase no podran sobreescribir el método.

¿Y si el comportamiento no es el mismo para todas las páginas? Bueno, es más que probable que unas páginas tengan una lógica determinada, otras otra. Bastará con crear tantas clases como BasePage como criterios de seguridad tengamos y hacer heredar cada página de su correspondiente base.

Otra mejora consistiria en hacer el metodo ValidateAccess "virtual" para que cada página personalice su método para la validación.

Por supuesto, esto no debe aplicarse sin más. Hay ue analizar si es mejor este metodo que usar una distribución en carpetas, cada una con su Web.config. Queda a criterio del desarrolador.

Un saludo a todos :-)

No hay comentarios.: