El año pasado, nuestro equipo inicio el desarrollo de una aplicación para el control de volúmenes de obra. Iniccialmente planteamos usar totalmente técnologias Java (Struts 2, Hibernate). Despues del primer mes de desarollo por politicas de la empresa se cambio de lenguaje a C# con SQL server, asi que junto con mi equipo tuvimos que aprender la tecnología a golpe y porrazo, durante la marcha.
Como se podrán imaginar cometimos varios errores, por nuestro poco conocimiento .net. El viernes pasado reparé uno de los que más quejas y bugs ha causado es la restricción de accesos recursos segun el rol del usuario.
Restricción de accesos
En .NET 2.0 es posible restringir globalmente el acceso a un recurso (URL), colocando los privilegios de acceso en el Web.config. por ejemplo. si tenemos un sitio con la siguiente estructura
- Default.aspx
- /empleados/
- /admin/
Queremos restringir el acceso para que los empleados tengan acceso solo a consultar el detalle del empleado y los usuarios con rol administrador sean los unicos en acceder a /admin/Default.aspx se debe tener lo siguiente declarado en el Web.config
-
<location path=«admin/Default.aspx»>
-
<system.web>
-
<authorization>
-
<allow roles=«administradores»/>
-
<deny users=«*»/>
-
</authorization>
-
</system.web>
-
</location>
-
-
<location path=«empleados/DetalleEmpleado.aspx»>
-
<system.web>
-
<authorization>
-
<allow roles=«empleados»/>
-
<deny users=«*»/>
-
</authorization>
-
</system.web>
-
</location>
Con esto el framework solo permite el acceso a los usuarios perteneciente al rol especificado, niega el acceso a cualquier otro ()
- El atributo users puede tener los siguientes wildcards
- * indica cualquier usuario incluyendo el usuario anonimo
- ? indica usuario anonimo
Ocultar opciones en menus y en barras de navegación
Ahora para ocultar los paths indicados en los locations anteriores, en las opciones de menu. se debe agregar lo siguiente en el web .config
-
<system.web>
-
<siteMap defaultProvider=«secureProvider» enabled=«true»>
-
<providers>
-
<add name=«secureProvider»
-
description=«Default SiteMap provider.»
-
type=«System.Web.XmlSiteMapProvider «
-
siteMapFile=«Web.sitemap»
-
securityTrimmingEnabled=«true»/>
-
</providers>
-
</siteMap>
-
..
-
..
-
</system.web>
Lo mas importante es el atributo securityTrimmingEnabled con esto el XmlSiteMapProvider automaticamente oculta los paths no alcanzables para un usuario dado , tomando como referencia la configuración del web.config.
Nosotros pensabamos que la restriccion se hacia en base al atributo roles del elemento siteMapNode en el web.sitemap, pero ese atributo es tomado en cuenta solo para los nodos que no tienen una URL asociada, esto lo comprendimos despues de leer el post de Danny Chen , An overview of how securityTrimmingEnabled is supposed to work de implementar tantos remedios caseros para nuestros bugs , hasta implementamos un httpModule para filtrar las URLs, si tan solo la documentación fuera más clara y nosotros nos ubieramos detenido a aprender bien la tecnologia antes de hacer remedios caseros a la mexicana