La historia de mis desventuras

Palabras más, palabras menos sobre desarrollo de software.

Archive for the ‘Desarrollo de software’ Category

Error: Acceso a carpeta ‘/Reports’ en aplicación ASP.NET requiere autenticación

Posted by Jhonny López Ramírez en 13 enero 2013

Caso

Se publica una aplicación ASP.NET en un servidor IIS. Se configura para la aplicación el acceso de usuario vía Forms Authentication. El acceso a todas las secciones del sitio web obedece correctamente a las reglas de acceso, es decir, si es requerida la autenticación para acceder a un recurso el usuario previamente deberá proveer sus credenciales de acceso. Si la aplicación cuenta con una carpeta ‘/Reports’ el acceso a esta solicita credenciales de acceso no mediante la página de Login configurada sino mediante el formulario de autenticación estándar del navegador.

Causa

En el servidor que hospeda la aplicación está simultáneamente instalado Microsoft Reporting Services. Este está configurado para escuchar las solicitudes en el puerto 80 por defecto y su URL de acceso está establecida como http://localhost:80/Reports. Esta configuración causará que se intente ejecutar Reporting Services cada vez que se acceda a la carpeta ‘/Reports’ de nuestra aplicación con toda la parafernalia de autenticación que SSRS tenga definida, aunque nuestra aplicación no esté haciendo uso de SSRS para la ejecución y visualización de los reportes.

Solución

En caso de no hacer uso de Microsoft SQL Server Reporting Services, deshabilite la ejecución del Servicio accediendo a la consola de servicios (Inicio – Ejecutar – Escriba services.msc y presione Entrar).

Solución Alternativa 1

En las situaciones en las que no se pueda deshabilitar SSRS en el servidor, o que al hacerlo se presente un error 503 al momento de ejecutar la carpeta ‘/Reports’ de nuestra aplicación proceda de acuerdo a la solución alternativa: mediante la aplicación Reporting Services Configuration Manager (disponible en Inicio –> Microsoft Sql Server <versión> –> Herramientas de Configuración –> Reporting Services Configuration Manager) actualice la URL de acceso a SSRS como se muestra en la siguiente imagen:

image

Figura 1: Se ha modificado la URL de acceso de ‘Reports’ (original) a ‘SSreports’.

Solución Alternativa 2

En caso de no poder modificar la URL de acceso de SSRS, modifique el nombre de la carpeta ‘Reports’ de su aplicación o modifique el puerto de acceso bien sea de SSRS o de su aplicación.

Fuente

https://www.interworks.com/blogs/banderton/2010/01/05/mysterious-http-authentication-required-reports

Posted in Desarrollo de software | Etiquetado: , , , | Leave a Comment »

MembershipProvider y .Net Framework 4.0

Posted by Jhonny López Ramírez en 24 enero 2011

dotnet4logo
Caso

Decides implementar un proveedor de membresía (o pertenencia) propio para resolver la autenticación y autorización de tus sitios web por medio de información almacenada en una base de datos de terceros (Oracle, MySql, etc.) o de servicios que están publicados a través de WCF. Adicionalmente, tendrás varios sitios web que usarán esta autenticación así que decides crear un proyecto de tipo biblioteca de clases (Class Library) con Visual Studio 2010, es decir, .Net Framework 4.0.

Como siempre has obrado en estos casos, sabes que debes escribir un proveedor de membresía personalizado que herede de la clase MembershipProvider; antes de eso debes referenciar la dll System.Web que contiene el espacio de nombres System.Web.Security. Escribes un código similar a este:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Web;
using System.Security;
using System.Web.Security;
using System.Configuration.Provider;
using System.Configuration;
using System.Web.Configuration;

namespace MyNamespace
{
    public class MyMembershipProvider : MembershipProvider

Te das cuenta que ni el intellisense ni una compilación logran reconocer a MembershipProvider como clase dentro del espacio de nombres System.Web.Security. Luego, en un proyecto web te das cuenta que MembershipProvider sigue estando en dicho espacio de nombres, lo cual aumenta la confusión.

Causa

En .Net Framework 4.0, la clase MembershipProvider, clase abstracta de la que deben heredar todos los proveedores de membresía ASP.NET personalizados, ha sido movida al ensamblado System.Web.ApplicationServices. Por defecto, los proyectos web en Visual Studio referencian dicho ensamblado, las bibliotecas de clases (Class Library) no.

Solución

Se debe referenciar en el proyecto de tipo biblioteca de clases (Class Library) el ensamblado System.Web.ApplicationServices. Después de esto se podrá hacer uso de la clase MembershipProvider del espacio de nombres System.Web.Security.

Posted in Desarrollo de software | Etiquetado: , , | 8 Comments »

Liberado Prism 4.0

Posted by Jhonny López Ramírez en 16 noviembre 2010

Recientemente fue liberada la versión 4.0 de Prism por parte de Microsoft Patterns & Practices.

Gg406140.pnp-logo(en-us,PandP.10).png

¿Qué es Prism 4.0?

Se trata de un conjunto de guías y bibliotecas destinadas al diseño y la construcción de aplicaciones de escritorio (WPF) o Web (Silverlight) ricas en experiencia de usuario, flexibles y fáciles de mantener. Parte de la implementación de patrones de diseño que se consideran claves en el desarrollo de este tipo de aplicaciones: una clara separación de conceptos y un escaso acoplamiento entre ellos.

Más allá del lanzamiento como tal, cabe destacar el compromiso que Microsoft y los miembros más activos de su comunidad tienen con Silverlight, plataforma cuyo futuro ha sido abiertamente cuestionado por la llegada de la próxima revisión del estándar HTML5. Aquí vuelve a dejarse en claro que Microsoft apuesta por Silverlight como ecosistema de desarrollo no solo para contenidos multimedia Premium sin también para aplicaciones de línea de negocio que requieren una rica experiencia de usuario en la web.

Lee el resto de esta entrada »

Posted in Desarrollo de software | Etiquetado: , , | 1 Comment »

Solución temporal a la reciente vulnerabilidad Zero-Day de ASP.NET

Posted by Jhonny López Ramírez en 18 septiembre 2010

Actualizado: La solución a esta vulnerabilidad ya ha sido liberada a través de Windows Update.

Recientemente se publicó una vulnerabilidad grave en las aplicaciones web desarrolladas con ASP.NET (MVC y WebForms). Dicha vulnerabilidad se encuentra en el API de criptografía de ASP.NET y puede ser explotada mediante ataques recurrentes enviando Requests erróneos al servidor que luego este, en los mensajes de error que devuelve, descifra parcialmente; si se envía una cantidad suficiente de mensajes y se analiza los resultados en los mensajes de error se pueden descubrir las claves de encriptación del sitio web y comprometer su seguridad al descargar, por ejemplo, el web.config del sitio, que puede contener información delicada.

Scott Guthrie, en su blog, ha publicado más información sobre la vulnerabilidad y ha ofrecido una solución temporal para evitar que los sitios actualmente publicados en ASP.NET sufran por esta vulnerabilidad. Me permito traducir dicha solución, la cual consiste en hacer uso de la cláusula customErrors del archivo de configuración, activándola y redirigiendo en caso de cualquier error a una única página, evitando así que se envíe, de vuelta, información importante al atacante.

En soluciones ASP.NET v1.0 a v3.5 la solución se vería así en el web.config:

<customErrors mode =On defaultRedirect=~/error.html />

Nota: La sección customErrors va dentro de la sección <system.web>.

Después de modificar dicha sección se agregaría una página error.html en el directorio raíz del sitio con un mensaje sencillo advirtiendo de un error y sin ofrecer detalles del mismo.

En soluciones ASP.NET v3.5 SP1 o superior la solución se vería así en el web.config:

<customErrors mode ="On" redirectMode="ResponseRewrite" defaultRedirect="~/error.aspx" />
Nota: La sección customErrors va dentro de la sección <system.web>.
Después de modificar dicha sección se agregaría una página error.aspx en el directorio raíz del sitio con un mensaje sencillo advirtiendo de un error y sin ofrecer detalles del mismo. 
Me permito agregar algunos consejos de seguridad en aplicaciones web ASP.NET:
  • Evitar almacenar información delicada en archivos de configuración del sitio si ésta no está encriptada.
  • Evitar, en lo posible, tener los archivos de configuración en el directorio raíz del sitio, para evitar que se prediga que están allí. Esto se puede modificar gracias a la cláusula configSource. Sin embargo, el archivo web.config que se propone en esta solución sí debe estar en el directorio raíz de la aplicación (en caso de que sólo esté esta solución en el web.config del directorio raíz, no olvidar encerrar el texto propuesto entre las etiquetas system.web).
  • Activar siempre la cláusula customErrors y personalizarla (por ahora como se propone en esta solución) para mostrar mensajes de error pre-procesados. Ya saben que una YSoD ofrece mucha información al usuario.
Finalmente, ScottGu ofrece una herramienta que nos permitirá descubrir si nuestros sitios web permitirían el ataque. El uso de esta herramienta, una vez descargada, se muestra en esta imagen:
command

Este script mostrará los sitios que carecen de la directiva customErrors o que la tienen configurada de forma tal que se permita el ataque.

Posted in Desarrollo de software | Etiquetado: , | Leave a Comment »

La informática del futuro – Reflexión

Posted by Jhonny López Ramírez en 6 mayo 2010

Recuerdo la percepción que tenía en mi niñez de lo que sería el futuro. Un poco inspirado por las películas que veía y en las que mostraban lo que sería el mundo a estas alturas. Computadoras que sostenían conversaciones fluidas con seres humanos, robots con comportamientos similares a los de las personas, el auto fantástico y una serie de gadgets haciendo una y otra cosa aquí y allá. Cuanto tuviera 26 años, pensaba, ya debería tener un carro que volara. Hoy tengo esa edad y ni los carros vuelan ni yo tengo uno que se arrastre siquiera; no es que esté triste por ambas cosas pero creo que están tardando en suceder.

Ahora que ya estoy en lo que, para entonces, era el futuro veo que quedan muchas cosas por hacer. Que la innovación aunque presente, muy presente, en el presente dista un poco de lo que se prometía en la ciencia ficción de ochentas y noventas. Todo esto en lugar de decepcionarme me parece excitante pues aún quedan caminos por recorrer y me siento joven y dispuesto a lo que venga. Quiero participar de ello, de hacer el futuro, de construir aplicaciones y sistemas y robots, etc., que hagan nuestra vida muchísimo más amigable. En ese sentido apuntan los grandes en la informática y otras áreas y quiero estar en primera plana, con las botas puestas, “cuando estalle la guerra estaré en la trinchera contigo”.

Todo esto viene a cuento debido a varias cosas, entre ellas que viendo a lo que apuntan elementos innovadores como las pantallas táctiles, el reconocimiento de rasgos y gestos humanos, lo que se rumora que será Windows 8, lo que será el Proyecto Natal, en fin, frente a todo eso he tenido momentos de escepticismo. No porque no crea que son geniales, no. Simplemente porque día a día te vas internando en tu trabajo y lo que haces puede tornarse repetitivo y ves el software corporativo tan distante de ello, como anclado aún al ratón y al teclado, a las grillas, a las listas desplegables, en fin. Y todo eso sientes que pasará de largo frente a lo que haces a diario: software para el trabajo. Luego he leído una interesante entrada en el blog de Jaimir Guerrero y me he sentido repentinamente viejo puesto que asumía posiciones lejos de lo que yo mismo en la niñez contemplaba como emocionante, como el futuro.

Así que he decidido sacudirme las telarañas y prometerme que seré parte de dicha evolución, que estaré en el equipo de los que transformen el mundo y que hagan del software corporativo (y el software en general) una realidad que supere la ficción. Estoy joven (de nuevo) y dispuesto.

Posted in Desarrollo de software | Etiquetado: | 1 Comment »

Breve Autocomplete Helper con ASP.NET MVC y jQuery

Posted by Jhonny López Ramírez en 16 marzo 2010

Han pasado ya varios días desde la última vez que escribí algo en el blog. Escaso tiempo. Vengo hoy con un pequeño Helper construido para hacer las veces de Autocomplete en ASP.NET MVC. Se trata de un ejemplo sencillo basado en un práctico jQuery Autocomplete (que pueden descargarse de aquí).

Una vez he descargado el paquete paso a descomprimirlo y a pegar los archivos claves en las rutas correspondientes, como muestro en la siguiente imagen:

2

Lo siguiente que haré será crear el HtmlHelper para automatizar el proceso de escritura de la función que hará la gracia. Para hacerlo tengo que disponer de una clase con los modificadores de acceso public y static y dentro un método de extensión a la clase HtmlHelper. Pongo aquí el código:

using System.Text;

using System.Web.Mvc;

 

namespace AutoCompleter.Helpers

{

    public static class MyHelpers

    {

        public static string AutoCompleter(this HtmlHelper helper, string name, string controller, string action, string fieldName, bool mustMatch)

        {

            StringBuilder html = new StringBuilder("<script type=\"text/javascript\">");

 

            html.Append("$(document).ready( function() {");

            html.AppendLine("$('#" + name + "').autocomplete('/" + controller + "/" + action + "/', {");

            html.AppendLine("dataType: 'json',");

            html.AppendLine("parse: function(data) {");

            html.AppendLine("var rows = new Array();");

            html.AppendLine("for(var i=0; i<data.length; i++){");

            html.AppendLine("rows[i] = { data:data[i], value:data[i]." + fieldName + ", result:data[i]." + fieldName + " };");

            html.AppendLine("} return rows;},");

            html.AppendLine("formatItem: function(row, i, n) {");

            html.AppendLine("return row." + fieldName + ";},");

            html.AppendLine(" width: 300, mustMatch: " + mustMatch.ToString().ToLower() + " , });});</script>");

 

            return html.ToString();

 

        }

    }

}

 

Lee el resto de esta entrada »

Posted in Desarrollo de software | Etiquetado: , | Leave a Comment »

Despliegue de aplicaciones Web con Visual Studio 2010 – MSDeploy

Posted by Jhonny López Ramírez en 21 febrero 2010

Una de las mejoras importantes que incorpora Visual Studio 2010 está relacionada con el despliegue de aplicaciones web. Es importante desde múltiples perspectivas pero yo citaré una que proviene de mi experiencia. Como desarrolladores algunas veces nos abstraemos del trabajo de la configuración e instalación de las aplicaciones que desarrollamos, pero en diversos escenarios ocurre que los roles no están tan definidos y tenemos que abarcar todo el ciclo de desarrollo y distribución de nuestras producciones y es allí donde a veces tenemos dolores de cabeza por horas de errores que casi no comprendemos.

Puesta esta situación vamos a mostrar escuetamente una de las nuevas técnicas de despliegue de aplicaciones que vienen empaquetadas en Visual Studio 2010: MSDeploy. Para ello he creado una pequeña aplicación Dynamic Data que no interesará mucho para los propósitos de esta entrada, salvo como elemento de laboratorio.

Trabajando entonces en nuestra aplicación ASP.NET vamos a configurar un perfil de despliegue para la misma basado en MSDeploy. Para hacerlo vamos a ir al menú Build y seleccionaremos de allí la opción Publish <nombre del proyecto>. O podremos dirigirnos directamente al menú Publish de nuestra barra de herramientas:

1

Seleccionaremos la opción Create Publish Settings – <New> y aparecerá el siguiente cuadro de diálogo:

2

En primer lugar tendremos el nombre del perfil de publicación y adicionalmente las siguientes opciones:

  • Publish method: Podremos escoger entre Web Deploy, FTP, File System y FPSE. Para este caso usaremos Web Deploy.
  • Service URL: Hace referencia a la ruta en la que se publicará el archivo de despliegue de la aplicación en el servidor de aplicaciones. Para este ejemplo he puesto http://localhost/DDEWA/MsDeploy.axd (previa configuración de dicha ruta en mi IIS).
  • Site/application: Se refiere al nombre del sitio en el Internet Information Services. Incluso puede especificarse una estructura de subdirectorios en este parámetro. En mi caso he puesto DDEWA/Test.

Podemos también marcar la aplicación como IIS en el destino y especificar que no se borrarán archivos adicionales en las carpetas publicadas una vez hagamos re-publicación. También, si se ha configurado acceso restringido a las carpetas virtuales de publicación en el servidor podemos especificar las credenciales del usuario autorizado. Usaremos el botón Save de este cuadro de diálogo para almacenar este perfil.

Lee el resto de esta entrada »

Posted in Desarrollo de software | Etiquetado: , , | 17 Comments »

“Hola mundo”, en vivo desde Visual Studio 2010 RC1

Posted by Jhonny López Ramírez en 14 febrero 2010

Hoy por fin tuve algo de tiempo libre para instalar el Release Candidate 1 de Visual Studio 2010. Esta entrada es meramente documental y no supone muchos detalles técnicos. Simplemente emborrono cuartillas.

Impresiones sobre la instalación

Es probable que sea una mera impresión, pero fue más rápida la instalación de VS2010 que la de sus antecesores. No hice una métrica seria al respecto puesto que hacía otras cosas al tiempo pero me pareció bastante más rápido el proceso.

 

Requirió reiniciar el equipo después de la instalación del Framework (4.0 RC1) y experimenté un pequeño contratiempo después de hacerlo: había descargado el ISO para la instalación y lo monté en una unidad virtual; al reiniciar el equipo no se montó automáticamente el ISO en la unidad virtual, como era de esperarse, haciendo fallar al instalador que continuaba su proceso. Afortunadamente el mensaje de error ofrecía la opción Reintentar y después de montar de nuevo la imagen en la unidad continué con el proceso.

ErrorUnidad

 

Lee el resto de esta entrada »

Posted in Desarrollo de software | Etiquetado: | Leave a Comment »

Visual Studio 2010 Release Candidate

Posted by Jhonny López Ramírez en 10 febrero 2010

Disponible desde hoy para descarga la versión candidata a comercial del Visual Studio 2010, como lo anuncia Soma en su blog en español.

Posted in Desarrollo de software | Etiquetado: | Leave a Comment »

Autorización configurable en ASP.NET MVC

Posted by Jhonny López Ramírez en 26 diciembre 2009

En esta entrada construiremos un prototipo de configuración de autorización para ASP.NET MVC. En el Web.config de la aplicación asociaremos las acciones del controlador con los roles que estarían autorizados. Para este caso tendremos una aplicación con tres roles: Administrator, Advanced, Limited.

Lo primero que crearemos será la sección de configuración que nos permitirá especificar la autorización a los distinos roles de la aplicación. Para ello, en el apartado <configsections> de nuestro web.config crearemos una sección de configuración:

<configSections>
 <section name="MyMvcAuthorization"
  type="System.Configuration.NameValueSectionHandler,System,Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"/>
</configSections>
A continuación y para simular el comportamiento de una aplicación crearemos un Controller, una clase de modelo y unos métodos de acción. A continuación cada uno:

El modelo

En la carpeta models de nuestro proyecto agregaré un archivo Model.cs y escribiré el siguiente código:

namespace MVCAuthorization
{    
     public class Person    
    {        
          public string Name { get; set; }
          public int Id { get; set; }    
     }
}

Como ven, se trata de un POCO bastante sencillo. Vamos con el controller:

El controller

Una clase controladora sencilla:

namespace MVCAuthorization.Controllers

{

    public class PersonsController : MyBaseController

    {

        List<Person> persons = new List<Person>();

        //

        // GET: /Persons/

        [Authorize()]

        public ActionResult Index()

        {



            Person firstPerson = new Person

            {

                Id = 1,

                Name = "Fulano de Tal"

            };


            Person secondPerson = new Person

            {

                Id = 2,

                Name = "Sutano de Tal"

            };


            persons.Add(firstPerson);

            persons.Add(secondPerson);


            return View();

        }


        //

        // GET: /Persons/Details/5

        [Authorize()]

        public ActionResult Details(int id)

        {

            Person person = persons

                .FirstOrDefault(it => it.Id == id);


            return View(person);

        }


        //

        // GET: /Persons/Create

        [Authorize()]

        public ActionResult Create()

        {

            return View();

        }


        //

        // POST: /Persons/Create


        [AcceptVerbs(HttpVerbs.Post)]

        public ActionResult Create(Person person)

        {

            try

            {

                // TODO: Add insert logic here

                persons.Add(person);

                return RedirectToAction("Index");

            }

            catch

            {

                return View();

            }

        }


        //

        // GET: /Persons/Edit/5

        [Authorize()]

        public ActionResult Edit(int id)

        {

            return View();

        }


        //

        // POST: /Persons/Edit/5


        [AcceptVerbs(HttpVerbs.Post)]

        public ActionResult Edit(int id, FormCollection collection)

        {

            try

            {

                // TODO: Add update logic here


                return RedirectToAction("Index");

            }

            catch

            {

                return View();

            }

        }

    }

}

De esta clase controladora quiero que notemos dos cosas interesantes: en primer lugar, que la clase hereda de MyBaseController. La implementación de esa clase base la pondré aquí más adelante, dado que es esta clase la que se encargará de verificar si una acción está autorizada a un usuario en un rol determinado. En segundo lugar, que cada método (puntualmente cada GET) está decorado con el atributo [Authorize()]. Esto obligará a los usuarios no autenticados a loguearse. Y obligará, también, a que la clase base, como lo veremos más adelante, verifique para dichos métodos la autorización.

Lo que se hará a continuación es establecer, de esta clase controladora, los permisos de los roles frente a los métodos de acción. Para ello volvemos al web.config y agregamos la sección MyMvcAuthorization, que hemos definido anteriormente y que es un Dictionary tradicional:

Lee el resto de esta entrada »

Posted in Desarrollo de software | Etiquetado: | 10 Comments »