jueves, febrero 09, 2006

Seguridad en ASP.NET 2005

Hoy grabamos el último programa del pozo técnico. Y lo hicimos utilizando toda la tecnología a nuestro alcance. Carlos que es el dueño del changarro me invito para que platicáramos de este tema. Y pues la verdad nos quedo muy padre.

Para aquellos que no tengan la fortuna de conocer este espacio para desarrolladores lo pueden encontrar en http://pozotecnico.carlosmadrigal.com

En ese podcast hablamos de las razones por las que queremos utilizar seguridad.Y yo lo resumiría en lo siguiente, si no queremos que cualquiera entre a la información que estamos manejando necesitamos implementar un herramienta que nos brinde la posibilidad de limitar el acceso a nuestras aplicaciones.

Cuando hablo de seguridad en este articulo solo me voy a referir al concepto de Autenticación y Autorización. Ya que la seguridad es un tema mucho mas amplio. Que no podría ser abarcado en una sola entrada de un blog.

Hasta hace unos meses hablar de seguridad en una página web implicaba una de cuatro posibles soluciones.

1.- No te preocupabas por ella.

2.- Le encargabas el problema al IIS y a la seguridad basada en roles de windows.

3.- Programabas una y otra vez la seguridad cada que surgía la necesidad.

4.- Programabas tu seguridad a patita y de una u otra manera tratabas de reutilizar el código para no hacerlo una y otra vez

Fue entonces que se empezaron a crear patrones de aquellas cosas que se realizaban una y otra vez par crear la seguridad y es en la última versión del framework de .NET cuando Microsoft genera una clase abstracta que facilita la tarea a todos los programadores. En algunos casos ya algunos programadores habíamos hecho la tarea y teníamos algo similar.

Pero el hecho de que Microsoft haya generado una base para trabajar con la seguridad facilita las cosas sobre todo para aquellos que van empezando y que no han tenido que lidiar con este tema o inclusive para aquellos que han tenido que lidiar con el y sufrían una y otra vez con este tema.

La manera en que fue aplicado este patrón en la versión 2.0 de .NET es por medio del espacio de nombres system.Web.Security.Membership y entre las tareas que te permite hacer están las siguientes:

Crear usuarios

Validar si el usuario (Autentificación)

Cambiar passwords

Eliminar al usuario

Es importante mencionar que la clase Membership es la que te permite gestionar la seguridad, pero no trabaja de forma independiente, sino que aprovecha otras clases para realizar diversas actividades como son la clase MembershipUser, RoleProvider que se encargan de los usuarios y los roles respectivamente.

Entonces para realizar cada una de las funciones que mencione con anterioridad existen métodos que te permiten realizarlas. (Si no sabes que es un método revisa el artículo anterior). Te daré algunos ejemplos. Pero no son todos y como la lista es amplia. Puedes leer más de este tema en las ligas al final de este blog.

CREAR UN USUARIO es igual a usar el método

CreateUser (username, password, email, passwordQuestion,

passwordAnswer, isApproved, providerUserKey, status)

devuelve MembershipUser

VALIDAR EL USUARIO es igual a usar el método

ValidateUser (username, password)

devuelve verdadero o false

CAMBIAR PASSWORDS es igual a usar el método

ChangePassword(username,oldPassword, newPassword)

devuelve true o false

ELIMINAR AL USUARIO es igual a usar el método

DeleteUser(username, deleteAllRelatedData)

devuelve true o false

 

Y bueno para que sirve todo esto.

Pues que al final existen unos bellos objetos de arrastrar y soltar que puedes utilizar con Visual Studio 2005 que te permiten aprovechar todo lo anterior. Sin tener que escribir código adicional. Y lo que es mejor aún. Sin tener que escribir código a menos de que tu así lo decidas. Por lo tanto si quieres realizar una actividad adicional. Puedes utilizar los eventos que realizan los nuevos objetos para aplicar la funcionalidad.

Los nuevos objetos son:

Login

LoginView

PasswordRecovery

Login Status

LoginName

CreateUserWizard

Y con estos ahora la seguridad se reduce a unos cuantos sencillos pasos.

Y bueno para aquellos que seguro se preguntan como configuro este asunto.

Tienen que abrir el archivo de web.config que se encuentra en la carpeta raíz del proyecto y copian el siguiente código en XML no olvidando adecuar los parámetros que necesiten cambiar.


<configuration>
     <connectionStrings>
          <add name="MySqlConnection"
               connectionString="Data Source=MySqlServer;
  Initial Catalog=aspnetdb;
  Integrated Security=SSPI;" />
</connectionStrings>
     <system.web>
<authentication mode="Forms" >
<forms loginUrl="login.aspx"
    name=".ASPXFORMSAUTH" /> 
</authentication>
<authorization>
<deny users="?" />
</authorization>
<membership defaultProvider="SqlProvider"
   userIsOnlineTimeWindow="15"> 
<providers>
<clear />
<add name="SqlProvider"
         type="System.Web.Security.SqlMembershipProvider" 
   connectionStringName="MySqlConnection" 
   applicationName="MyApplication" 
   enablePasswordRetrieval="false" 
   enablePasswordReset="true" 
   requiresQuestionAndAnswer="true" 
   requiresUniqueEmail="true" 
   passwordFormat="Hashed" />
</providers>
</membership>
</system.web>
</configuration>

Para cuando lleguen a este paso, es necesario que creen la base de datos que utilizara la clase Membership para guardar los usuarios.

Para mas información sobre este tema pueden revisar el link siguiente:

http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnpag2/html/paght000014.asp

En la liga anterior podrán encontrar un Paso a Paso de lo que tienen que hace para aplicar la seguridad.

Saludos

Actualización febrero 21: Paulo Arancibia nos hace llegar esta liga a un webcast que él hizo y cae como anillo al dedo con este tema

Muchas gracias Paulo

2 Comments:

Anonymous Armando Andrade said...

Hola un saludo, hoy estuvo escuchando la primera parte de su podcast y como dijiste que dejaramos comentarios para alimentarlos pues aqui te va el mio. El concepto de los providers es muy interesante y si, definitivamente te facilita el trabajo muchisimo, de manera personal termine una aplicacion de .NET 2.0 en un tiempo record de 1 mes, cuando la parte mas laboriosa era la de seguridad. En este caso el modelo me sirvio de maravilla, no sin antes encontrarme con algunos detalles. Por ejemplo si quieres agregar mas detalles a tus usuarios, como lo comentaste puedes usar el Profile, aunque no siempre es lo ideal, por ejemplo si ya tienes una estructura definida de una aplicacion pre 2.0 que quieras migrar, siempre tienes la opcion de poner esta informacion en una tabla adicional, usando la llave (guid) que usa el membership (hablando de sql), pero luego te encuentras con el problema de hacer solo una transaccion el hecho de crear el usuario y ademas crear tu propia informacion en la tabla alterna. Por ultimo si realmente quieres modificar el membership, es bastante complejo y debes tener un conocimiento MUY solido de todas las clases que la componen. A fin de cuentas si el modelo te sirve tal cual, adelante usalo, esta increible, pero si necesitas modificarlo directamente, te recomiendo que te sientes con una taza de cafe y a estudiarlo muy pero muy bien.
Saludos!!!

2/21/2006 01:45:00 AM

 
Blogger Raúl Guerrero said...

Estimado Armando:

Inicialmente te agradezco muchísimo tu comentario, y en efecto con tu comentario ha valido el esfuerzo que implico hacer ese podcast.

Sobre lo que comentas comparto completamente tu punto de vista. Efectivamente es algo difícil adecuar el modelo Membership como tal, para poder agregar información adicional. En lo personal he encontrado que es muy buena opción utilizarlo si no has desarrollado ningún modelo que te administre la seguridad. O en el caso en el que deseas conocer un patrón de seguridad ya implementado. Ya que muchas veces cuando desarrollamos nuestros sistemas de seguridad olvidamos, o no contemplamos algunos temas que son importantes.

Pero como veo que ya habías trabajado en un modelo de seguridad antes. Muy probablemente lo que mas te convenga sea crear tu propio provider membership que herede de la clase System.Web.Security.MembershipProvider. De esta manera puedes utilizar tu sistema actual de seguridad para levantar los usuarios y administrar la seguridad. Y al utilizar tu propio proveedor puedes aprovechar los objetos que te ofrece el membership para implementar la seguridad. Actualmente es el modelo que yo utilizo. Ya que cuento con un sistema de seguridad que se encarga de hacer todas las tareas de levantamiento y administración de la seguridad, el cual además me permite administrar cuestiones adicionales que tienen que ver con el filtrado de información. Que es un punto que no me administra la clase Membership.

Pero no te preocupes en la parte 2 del podcast hablaremos precisamente de este tema. Y seguramente ahí escucharas como implementamos un membership provider utilizando un sistema actual de seguridad.

Adicionalmente te agrego esta liga que en lo personal me ha servido mucho como guía. Si te atoras en algún punto házmelo saber y con gusto nos echamos un clavado. En este documento se encuentra un ejemplo de como se hace un proveedor de membresía.

http://msdn2.microsoft.com/en-us/library/6tc47t75(VS.80).aspx

Te mando un cordial saludo y estamos en contacto.

2/21/2006 09:46:00 AM

 

Publicar un comentario en la entrada

Links to this post:

Crear un vínculo

<< Home

suscribete al podcast

Agrega a Netvibes Subscribe with Live.com