Seguridad y Autorizacion centralizada en base de datos con Asp.Net MVC

por Andres Stang  22. diciembre 2010

La palabra Seguridad es siempre una consulta que recibo cuando hablo de cómo programar en Asp.Net, y siempre me gusta dar el mismo chiste como respuesta: “Vamos por partes decía Jack el Destripador”. Es importante dividir un problema grande en problemas más pequeños y por ende más manejables, y hablando de seguridad la fórmula es sencilla.

 

SEGURIDAD = AUTENTICACIÓN + AUTORIZACIÓN


Es decir, tenes que resolver por un lado como identificar al usuario, para saber que es quien dice ser que es, y por el otro lado una vez que sepamos su identidad, tenemos que decidir si lo dejamos acceder o no.

Cuando creamos un proyecto nuevo de MVC, el template nos da una GRAN ayuda y propone resolver (mejor dicho, ya lo implementa y lo resuelve por defecto) cada tema con un componente específico. Para la autenticación utiliza Asp.Net Membership y para la autorización el decorador [Authorize].

Ambos componentes funcionan maravillosamente pero hay uno que me gusta y otro que no. Concretamente Asp.Net Membership me parece perfecto para resolver una gran cantidad de escenarios y contextos, y generalmente lo utilizo en mis proyectos. Pero el decorador de autorización a mi criterio tiene dos grandes falencias:

  • Falta de flexibilidad: el componente de autorización puede recibir como parámetro el usuario y el rol, pero esto queda explícito en el código, es decir, si me surge la necesidad de agregar un nuevo rol al sistema deberé recorrer el código, cambiarlo, recompilar y realizar un deploy del sitio.
  • Verborragico: el componente requiere gran escritura y definición por parte del programador. Esto, mas allá de la poca elegancia del código, define que sea el programador quien decide quien esté autorizado a entrar a cada acción. Y ante un error, descuido o falta de memoria del programador podemos comprometer a nuestra aplicación dejando expuesta funcionalidad sensible a usuarios indeseados.

 

¿Cómo resolvemos esto?


Allá por el año 2007 Daniel Laco escribió uno de los post más consultados de este sitio:


Autenticación de usuarios basada en Roles utilizando HTTPModules en ASP.NET


De forma muy sencilla y elegante resuelve las dos falencias presentadas. Y si bien el código no es compatible con todas las versiones del .net framework, o con el paradigma MVC, el concepto si aplica en el universo Asp.net.

Lo que haremos el día de hoy, es actualizar un poco el código para que puede ser utilizado en nuestros proyectos de MVC ;)

Lo primero que tenemos que hacer es programar el método de nuestro modulo, quedaría algo así:

 

 public void Init(HttpApplication context)
 {
     context.AuthorizeRequest += new EventHandler(OnAuthorizeRequest);
 }
 
 void OnAuthorizeRequest(object sender, EventArgs e)
 {
     HttpContext context = ((HttpApplication)sender).Context;
 
     RouteData routeData = RouteTable.Routes.GetRouteData(new HttpContextWrapper(context));
 
     if (routeData != null)
     {
         string controller = routeData.GetRequiredString("controller");
         string action = routeData.GetRequiredString("action");
 
         if (!EstaAutorizado(controller, action, context.User))
         {
             /// 401 es el codigo de resultado HTTP para acceso no autorizado
             context.Response.StatusCode = 401; 
             context.Response.End();
         }
     }
 }

 

En el código vemos cómo recuperar la información de la ruta para saber que método estamos ejecutando, y luego definir que si no se encuentra autorizado el usuario, le responderemos con un código HTTP estándar: 401 (lista de códigos)

De esta forma dejamos actuar al framework de asp.net que ya tiene resuelto el enganche y resolución del caso. Por ejemplo, MVC viene configurado por defecto que ante un error de autenticación redirija al usuario automáticamente a la página de login:

 

<authentication mode="Forms">
   <forms loginUrl="~/Account/LogOn" timeout="2880" />
</authentication>

 

Lo único que nos falta, es recordar agregar el modulo a nuestro web.config para que se ejecute:

<httpModules>
  <add name="MiModulo" type="AutorizacionMVCHttpModule.Models.MiModulo"/>
</httpModules>

 

Listo! Con muy pocas líneas hemos resuelto de manera elegante y limpia un requerimiento esencial y controversial en la mayoría de nuestros proyectos.

Les dejo el código fuente de ejemplo para que lo puedan descargar y ver implementado
Download AutorizacionMVCHttpModule.zip (262,77 kb)

Happy coding!

Tags: , , , , ,

.NET | ASP.NET | Desarrollo Web

TFS y los productos de terceras partes

por Victor Passador  7. diciembre 2010

Me acabo de cruzar con un post de la gente de Urban Turtle, que me pareció muy interesante.

Habla de herramientas de terceras partes que extienden la funcionalidad de TFS.

Es cada vez mayor la cantidad de herramientas que aparecen en la web que se valen de la extensibilidad que brinda TFS y que proponen complementar y/o optimizar los diferentes aspectos que cubre la solución ALM de MS (además, no sería loco pensar que esta tendencia se vaya acentuando con cada nueva versión de la plataforma).

Si bien esto supone un gran beneficio, aunque más no sea por la cantidad y variedad de la oferta, me pareció interesante difundir algunos de los cuidados que según Mario Cardinal (y quien suscribe) deberíamos tener al momento de elegir alguna de estas herramientas. Todo esto sin mencionar cuestiones de costos por licenciamiento, sólo enfocándonos en cuestiones más bien técnicas.

Antes de que sigan leyendo vale una aclaración. Yo sé que muchos van a pensar que la mayoría de estas cuestiones son más que obvias, pero también sé que ante alguna necesidad concreta de esas que queman, no tenemos demasiado tiempo para andar pensando a mediano o largo plazo y se vuelve muy tentador instalar alguna solución para salir rápidamente del escollo.

Propongo que nos detengamos un minuto y hagamos una checklist que incluya, al menos, alguno de estos puntos:

Soporte

  • Qué tipo de soporte se ofrece?
  • Cuándo fue publicada la última versión? Cada cuanto se publican? Sigue en Beta?
  • Está disponible el código fuente?

Evolución de la plataforma ALM

  • Será fácil migrar cuando aparezca la próxima versión de TFS? (aquel que pueda responder este tipo de preguntas rápidamente, que por favor se contacte por privado porque necesito que me preste la bola de cristal por algunos días)

Relación con el servidor TFS

  • Modifica el esquema de Base de Datos de TFS?
  • Requiere modificación de los templates de proyectos ya creados?
  • Tengo varios proyectos creados con diferentes templates, alguno de ellos personalizado. Se adapta a todos los proyectos?.
  • Y a todos los tipos de Work Item?
  • Tengo varios proyectos, en diferentes versiones de TFS. Aplica a todas las versiones?
  • Qué impacto tiene el hecho de que esa herramienta no aplique para todos mis proyectos y/o versiones de TFS?
  • Qué pasa con el Data Warehouse y con los reportes ?
  • Los que ya están van a seguir funcionando?

 

Deployment y mantenibilidad

  • Sirve para cualquier proyecto que ya esté en marcha o sólo para nuevos proyectos?
  • Requiere instalar algún componente en los clientes?
  • Qué tan compleja es esta instalación?
  • Qué tipo de desarrollos soporta (Winform, Web, WPF, etc.) ?

 

Localization

  • Es compatible con la configuración de mi servidor TFS?
  • Y con la configuración de Collation de mi SQL Server?

 

Verifiquemos por favor que en lugar de encontrar una solución no estemos encontrando un nuevo problema.

Saludos !

Tags: ,

ALM | TFS

Clonando Twitter de 0 a 100% con Asp.NET MVC

por Alejandra Federico  2. diciembre 2010

El 15 de Diciembre se realizará una charla en el MUG, sobre "Clonando Twitter de 0 a 100% con Asp.NET MVC"

Aqui les dejo los datos del evento:

Título: Clonando Twitter de 0 a 100% con Asp.NET MVC

Oradores: Andrés Stang (Vemn Sistemas) / Fernando Abuin (Vemn Sistemas)
Horario: 18:30 a 21:30 hs.
Dirección: Auditorio MUG - Rivadavia 1479 1º A , Ciudad de Buenos Aires


Descripción: Utilizando Asp.NET como plataforma, y apoyados en MVC, Entity Framework y JQuery entre otros, se mostrará el armado de una aplicación compleja como lo es Twitter de forma completa y práctica. Tanto desarrolladores con experiencia como aquellos que están haciendo sus comienzos en la plataforma podrán tener una visión de los requerimientos y componentes que hacen falta para la construcción de una aplicación funcional. Se propone una reunión abierta y dinámica donde los asistentes puedan participar tanto en propuestas como en consultas.

Tags:

ASP.NET

Acerca de los Autores

Este es el blog del equipo de VEMN SA 
Presentaremos temas que nos parezcan de interés sobre tecnología .NET, Procesos y Metodologías y todo aquello relacionado con el proceso de desarrollo de Software

Month List

BlogRoll

Download OPML file OPML