Posteado por: Carlos J. Valera A. | Noviembre 27, 2006

Hábitos seguros!!!

8 reglas sencillas para desarrollar un código más seguro

Hábito N.º 1: Asumir la responsabilidad

Es una variante del clásico comentario “No hay bala de plata” que hizo hace más de 25 años Fred Brookes en The Mythical Man Month (en inglés). Procurar mecanismos de seguridad adecuados en su producto depende totalmente de usted. Nadie más (ni, por supuesto, ningún lenguaje de programación ni herramienta mágica) puede solucionar todas las lagunas de seguridad. No quiero que me malinterpreten: me gustan las herramientas de análisis de código fuente, pero no solucionarán mágicamente todas las vulnerabilidades de seguridad. Sólo usted puede hacerlo.

Los productos seguros son generados por desarrolladores que crean diseños seguros y escriben código seguro. Por último la escritura de código es un esfuerzo individual. El programador no puede ser reemplazado por una herramienta. Así pues, la seguridad de su producto es responsabilidad suya. Los gusanos Blaster y CodeRed se aprovechaban de código escrito por individuos (consulte la figura 1).

figura 1 código vulnerable son escritos por individuos
figura 1 código vulnerable son escritos por individuos

Recuerde que todo el código será examinado y, posiblemente, atacado. No hay ningún problema. Ser atacado es algo perfectamente normal. Lo importante es saber si su código quedará expuesto. Sólo usted puede determinar ese desenlace. Así pues, tómese en serio su código. Debe estar satisfecho con la calidad del código y poder dormir tranquilo sabiendo que, si es atacado, habrá hecho todo lo posible para impedir que lo dejen para el arrastre.

Si es posible, solicite a un experto de seguridad que revise su código. No pida que lo examine alguien sin experiencia en seguridad con la expectativa de que pueda encontrar errores de seguridad y vulnerabilidades. Procure por todos los medios recurrir a alguien que sepa realmente lo que tiene entre manos para que examine el código.

Y sea razonablemente humilde para pedir ayuda cuando la necesite. Antes comentaba que no debe confiar exclusivamente en las herramientas, pero no cabe duda de que debe aprovechar las que se encuentren a su disposición. Ejecute todas las herramientas de análisis de código fuente disponibles y hágalo con frecuencia. Aproveche cualquier construcción de lenguaje defensivo posible y todos los trucos de biblioteca que estén a su disposición. En C#, por ejemplo, ajuste el código de red que ejecute el acceso a matrices, donde el índice de matriz se derive de una solicitud de red, en operadores comprobados, para detectar posibles errores aritméticos con enteros.

Hábito N.º 2: No confíe nunca en los datos

Lo he dicho millones de veces y volveré a decirlo: toda entrada es nociva hasta que se demuestre lo contrario. Si nos fijamos en las vulnerabilidades de seguridad más atroces, veremos que comparten un rasgo común: el desarrollador confió en los datos entrantes. El problema es que, si el código asume que el formato de los datos es correcto, ¿qué ocurre si usted se equivoca con esa suposición? Si es su día, la aplicación se bloqueará. Con algo menos de suerte, el atacante podría introducir código malintencionado en sus procesos y causar estragos.

La ambigua definición de sistema seguro corresponde a la de aquél que realiza las tareas para las que está diseñado, ni más ni menos. Pero cuando surgen problemas derivados de la confianza en las entradas, el sistema suele verse obligado a desempeñar otras tareas. Un somero análisis de datos de Common Vulnerabilities and Exposures (CVE) (cve.mitre.org) muestra que, entre 2001 y 2004, el 47% de las vulnerabilidades de seguridad de las que CVE realizó un seguimiento fueron problemas relacionados con la confianza en las entradas. Los problemas más conocidos son saturaciones de búfer, errores aritméticos con enteros, secuencias de comandos entre sitios y errores de inyección SQL. Estamos empezando a ver nuevas variantes, como la inyección XPath y vulnerabilidades de inyección de protocolo ligero de acceso a directorios (LDAP).

Puede solucionar los problemas relacionados con la confianza en las entradas si aplica algunas normas simples. En primer lugar, no busque únicamente lo que le consta que tiene un efecto adverso; con ese planteamiento parte de la base de que conoce todo lo negativo y puede predecir lo que ocurrirá en el futuro. Buscar factores con efectos nocivos es una buena iniciativa siempre que no sea su único mecanismo de defensa. Una estrategia mejor consiste en restringir la entrada a lo que le consta que es adecuado. Con lenguajes de alto nivel, como C# y Perl, me gusta usar expresiones regulares para hacerlo.

A continuación, rechace lo que le conste que es perjudicial. Por ejemplo, si alguien solicita de forma remota un archivo a través de su código y el nombre del archivo incluye un carácter poco confiable (como : o \), rechace la solicitud. Y no le diga al atacante por qué; limítese a indicar “no se encontró el archivo”.

Por último, aunque esto no sirve en todas las situaciones, sanee los datos. Por ejemplo, en el caso de un servidor Web, debe codificar con HTML la salida procedente de una entrada potencialmente no fidedigna.

Hábito N.º 3: Diseñe amenazas contra su código

Dispone de modelos de amenazas, ¿verdad? Los modelos de amenazas le permiten comprender los riesgos potenciales para su software y asegurarse de que dispone de los remedios apropiados. Pero las ventajas del uso de modelos de amenazas no se limitan a un diseño seguro. Los modelos de amenazas pueden contribuir también a mejorar la calidad del código. Los modelos de amenazas le indican de dónde proceden los datos. ¿Se trata de datos locales o remotos? ¿Proceden los datos de usuarios anónimos o de usuarios de mayor confianza (autenticados), como los administradores?

Con esta información, puede determinar si sus defensas son apropiadas. Por ejemplo, el código al que pueden tener acceso usuarios anónimos y remotos tiene que ser muy seguro. No digo que el código al que sólo puedan tener acceso los administradores locales no debería ser seguro, sino que el código accesible de forma remota, sobre todo el que se ejecuta de manera predeterminada, debe ser a prueba de bombas; y eso implica más mecanismos de defensa, más revisiones y más atención a los detalles. Además, el modelo de amenazas puede indicarle la naturaleza de los datos que se protegen. Los datos empresariales de gran valor y la información personal identificable deben protegerse muy bien. ¿Son apropiadas sus defensas?

Asegúrese de que sus modelos de amenazas sean precisos y estén actualizados; después identifique todos los puntos de entrada en su código y clasifíquelos por accesibilidad: remotos o locales y usuarios con privilegios elevados frente a usuarios con pocos privilegios (o sin privilegios). El código más accesible debe revisarse en primer lugar y con mayor detenimiento. Por último, revise todo el código en las rutas de datos anónimos; dicho de otro modo, empiece por los puntos de entrada a los que se pueda tener acceso anónimamente y rastree los datos a lo largo de esa ruta, para asegurarse de que el código es correcto.

Hábito N.º 4: Vaya un paso por delante

El panorama de la seguridad evoluciona constantemente. Parece que cada semana hay nuevas variaciones con respecto a las cuestiones de seguridad. Esto significa que debe evolucionar y aprender acerca de nuevas amenazas y defensas, o sufrirá las consecuencias.

Algunas estrategias sencillas para mantenerse al día consisten en leer de vez en cuando algún buen libro sobre seguridad de software. Aprenda también de sus errores del pasado; mejor aún si se trata de los errores cometidos por otros. Para ello, puede leer bugtraq: vaya a securityfocus.com y regístrese para recibir mensajes de bugtraq en su bandeja de entrada. Pero acepte este pequeño consejo: cree una regla de la bandeja de entrada para mover los mensajes a una carpeta especial, de modo que pueda administrar el volumen. Es considerable.

Hábito N.º 5: Realice pruebas aleatorias

Las pruebas aleatorias permiten detectar errores de confiabilidad. Resulta que un porcentaje de los errores de confiabilidad corresponde a vulnerabilidades en la seguridad a la espera del “ataque adecuado”. Por supuesto, una saturación de búfer podría provocar el bloqueo de una aplicación; pero con una carga malintencionada bien diseñada, el atacante podría evitar el bloqueo y ejecutar código para sus propios fines. Nuestro lema para esos casos es “la denegación del servicio de hoy es la ejecución del código de mañana.”

Casi todos los errores o vulnerabilidades de análisis de archivos se detectaron por puro azar o por pruebas aleatorias. Microsoft ha detectado vulnerabilidades de seguridad analizando distintos formatos de archivo, como los correspondientes a archivos XLS, PPT, DOC y BMP. La mayoría de los fabricantes habían tenido vulnerabilidades similares, ya que el análisis de estructuras de datos complejas es una tarea complicada, el código complejo presentará errores y algunos de esos errores revelarán vulnerabilidades de seguridad.

Debe probar aleatoriamente todo el código que analice archivos y tráfico de red. El ciclo de vida de desarrollo de seguridad (SDL) de Microsoft es muy específico acerca de lo que esto significa para los formatos de archivo. Debe probar aleatoriamente todos los analizadores con 100.000 iteraciones de archivos con formato incorrecto mediante un comprobador aleatorio de archivos. Hay varios comprobadores aleatorios disponibles que funcionan correctamente, e incluimos un comprobador de archivos, así como código fuente C++, en el manual The Security Development Lifecycle (en inglés), que elaboré conjuntamente con Steve Lipner (microsoft.com/MSPress/books/8753.asp).

Una última nota acerca de las pruebas aleatorias. Si se bloquea el software, no crea que se trata de un bloqueo únicamente. Es probable que un porcentaje considerable de esos supuestos bloqueos estén invitando a que algún atacante escriba código malintencionado. Por lo tanto, no vea en un bloqueo “un mero bloqueo”.

Hábito N.º 6: No escriba código no seguro

En Microsoft usamos el concepto de puertas o compuertas de calidad para reducir las posibilidades de que un desarrollador introduzca código vulnerable en el producto. Estas “compuertas” ejecutan una batería de herramientas de análisis de código fuente en el código antes de proceder a su protección para señalar los problemas que pueda haber. Y los problemas identificados deben solucionarse antes de que se lleve a cabo la protección. También puede hacer que se apliquen reglas de código estrictas, como la exclusión del uso de funciones prohibidas, como la ausencia de llamadas a strcpy o strncat y el cifrado deficiente. (Microsoft ha prohibido más de 100 funciones de C en tiempo de ejecución para nuevo código). Por ejemplo, con relación al cifrado, no permitimos DES (la longitud de la clave es demasiado reducida), MD4 o MD5 (ya se han superado) en el código nuevo, a menos que un estándar del sector dicte su uso.

No reinvente funciones. Si tiene un código que analiza un formato de archivo determinado, no necesitará dos o tres conjuntos de código de análisis; aténgase a un conjunto, consolídelo y ajústelo de manera que pueda usarse en varios proyectos.

Por último, recuerde que las herramientas no son un sustituto para la escritura de código seguro. Por eso es tan importante la formación en materia de seguridad y privacidad. Necesita una comprensión sólida de los conceptos para tomar decisiones en conciencia y adquirir nuevas percepciones, algo inasequible para las herramientas.

Hábito N.º 7: Reconozca la asimetría estratégica

Ésta es una de mis cuestiones preferidas. Recuerde que, como desarrollador de software, las estadísticas en materia de seguridad van contra usted. Yo suelo llamarlo “la ventaja del atacante y el dilema del defensor”. Necesitaría que el código y los diseños fueran correctos al 100% en todo momento, y eso es imposible. Para empeorar las cosas, debe alcanzar el insuperable objetivo con un presupuesto fijo y a tiempo, mientras tiene que considerar los requisitos de compatibilidad, accesibilidad y otras “ades”. Un atacante puede dedicar todo el tiempo que desee para localizar un error y después anunciar al mundo que su aplicación no es segura.

En el hábito N.º 6 señalé que debería dejar de escribir nuevo código inseguro. Para el hábito N.º 7 tiene que concentrarse en todo el código, porque los atacantes no hacen distinciones en lo que respecta a la antigüedad. Dedique tiempo a revisar vulnerabilidades en el código antiguo, y considere seriamente la posibilidad de desechar funciones antiguas e inseguras. Si usa métodos de desarrollo ágiles, debe pensar en dedicar esfuerzos a corregir código antiguo para situarlo en el nivel de calidad del código más reciente.


Hábito N.º 8: Use las mejores herramientas que pueda

Por último, use las mejores herramientas que le sea posible. Me encantan las herramientas de análisis de código fuente y la tecnología que me ayuda a escribir código más seguro. Como señalé antes, las herramientas no son la panacea, pero ayudan. Y mucho. Las herramientas también facilitan la racionalización del problema del análisis de código fuente. Las herramientas pueden explorar grandes cantidades de código con rapidez, mucho más que una persona. Y esto le ayuda a hacerse una idea de lo “malo” que puede llegar a ser un determinado código.

Uno de mis trucos preferidos consiste en compilar código con los niveles de advertencia más altos que sea posible; por ejemplo, /W4 cuando uso Visual C++® o –Wall cuando uso gcc. Si ve un gran número de advertencias en el código, quizá éste presente otros errores que no detectaron el compilador u otras herramientas. Ese código debería someterse a un escrutinio más detenido antes de su lanzamiento (consulte el hábito N.º 3).

Éstos son ocho buenos hábitos que se han observado en desarrolladores a los que se respeta enormemente, y que trabajan tanto para Microsoft como para otros fabricantes. Por sí solos, los hábitos no le convertirán en un desarrollador seguro estelar, pero no cabe duda de que le ayudarán.

Fuente:

http://msdn.microsoft.com/msdnmag/issues/06/11/SecureHabits/default.aspx?loc=es

By Michael Howard.

Posteado por: Carlos J. Valera A. | Julio 21, 2006

Generar una aplicación de principio a fin (con VB.NET)

Generar una aplicación paso a paso o de principio a fin (con VB.NET):

Crear la tabla de la base de ‘Usuarios’:

Esta sección del recorrido guiado le permitirá crear una Aplicación Web ASP.NET de principio a fin. La aplicación del escenario que generaremos ofrece servicios de reporte de pedidos para los clientes registrados.

En este recorrido, usted creará una nueva base de datos llamada Usuarios en la base de datos MatrixOrders. Después, utilizaremos esta tabla de la base de datos para almacenar los nombres de usuarios/contraseñas de los clientes registrados — y utilizaremos el sistema integrado de Autenticación de los formularios ASP.NET para permitir que los usuarios inicien su sesión.

  1. Conéctese a la base de datos MatrixOrders creada en la sección previa del recorrido guiado.
  2. Haga clic en el nodo Tablas en la vista de árbol de la ventana Datos y haga clic en el botón Nuevo objeto de la base de datos en la barra de herramientas de la ventana Datos.
  3. Se le pedirá que introduzca un nuevo nombre de la tabla de base de datos. Escriba Usuarios en el cuadro de texto.
  4. El Proyecto de la Matriz Web ASP.NET creará la nueva tabla Usuarios y la agregará al nodo Tablas en la ventana Datos.Nodo secundario de la tabla de usuarios
  5. La tabla Usuarios se abrirá en la vista Diseño y se creará con una columna predeterminada llamada Column0.
  6. Con Column0 aún seleccionado, establezca las siguientes propiedades con los valores indicados a continuación:
    • Nombre: UserId
    • IsIdentity: Verdadero
    • InPrimaryKey: Verdadero
    • IsUniqueKey: Verdadero
  7. Agregue una segunda columna a la tabla Usuarios (al hacer clic en el botón Agregar nueva columna ).
  8. Con la columna recien creada aún seleccionada, establezca las siguientes propiedades a los valores indicados a continuación:
    • Nombre: UserName
    • Tipo de datos: varchar
    • Tamaño: 8
  9. Agregue una tercera columna a la tabla Usuarios y establezca las siguientes propiedades con los valores indicados a continuación:
    • Nombre: UserPassword
    • Tipos de datos: varchar
    • Tamaño del campo: 25
  10. Oprima Ctrl+S o haga clic en el Archivo->Guardar en el menú para guardar la tabla Usuarios.

Introducir los datos del Usuario: En este recorrido, usted agregará datos a la tabla Usuarios en la base de datos MatrixOrders que se creó en el recorrido anterior.

  1. Haga clic en la pestaña Datos (localizada en la parte inferior de la ventana de la tabla Usuarios ).
  2. Agregue dos nuevas filas de datos a la tabla Usuarios .
    Nota Oprima la tecla Intro o seleccione una fila diferente en la cuadrícula de datos para agregar una nueva fila a la base de datos. Nota La columna UserID está configurada para aumentar automáticamente (se inicia con 1 y va aumentando de 1 en 1 ). Automáticamente, la base de datos determina y asigna el siguiente valor para un campo de incremento automático cuando se genera una nueva fila en la base de datos. Los valores del campo de incremento automático son sólo de lectura y tendrán un valor negativo hasta que se agregue la nueva fila a la base de datos. Nota  Usted no puede editar la definición en una tabla si existen datos en la misma. Agregue filas a Usuarios
  3. Cierre la ventana de la tabla Usuarios .

Crear la página de datos maestros / de detalle:

En este recorrido, usted creará una nueva Página de datos con base en la plantilla del proyecto Cuadrícula maestra – de detalle. Usted unirá la Página de datos con los Pedidos y las tablas OrderDetails en la base de datos Pedidos.

  1. Seleccione Nuevo del menú Archivo. Usted verá que aparece el cuadro Agregar nuevo archivo.
  2. Seleccione Páginas de datos del panel Plantillas.
  3. Seleccione la plantilla Cuadrícula maestra – de detalle.
  4. Escriba la ruta del archivo en el cuadro Ubicación.
  5. Escriba Default.aspx en el cuadro Nombre de archivo.
  6. Seleccione Visual Basic en el cuadro desplegable Lenguaje.
  7. Haga clic en Aceptar. El archivo Default.aspx se abrirá en la vista Diseño. Diálogo de nuevo archivo
  8. Seleccione la pestaña Código. Nota: Automáticamente, la matriz Web ASP.NET ha colocado códigos para unir MasterGrid a una subrutina llamada BindMasterGrid y DetailsGrid a otra llamada BindDetailGrid.
  9. Modifique las variables ConnectionString y CommandText en la subrutina BindMasterGrid, de lal manera que hagan referencia a las columnas en la tabla Pedidos en la base de datos MatrixOrders.

    Dim ConnectionString As String = “server=(local);database=MatrixOrders;Integrated” &_
    ” Security=SSPI”

    Dim CommandText As String = “select OrderID, OrderDate, CustomerName from Orders”

  10. Modifique las variables ConnectionString y CommandText en la subrutina BindDetailGrid, de tal manera que hagan referencia a las columnas en la tabla OrderDetails en la base de datos Pedidos.

    Dim ConnectionString As String = “server=(local);database=MatrixOrders;Integrated ” &_
    “Security=SSPI”

    Dim CommandText As String = “select OrderDetailID, ProductName, Quantity, UnitPrice ” & _
    “from OrderDetails where OrderID = ‘” & filterValue & “‘”

  11. Seleccione la pestaña Diseño.
  12. Establezca la propiedad DataKeyField de MasterGrid en OrderID. La propiedad DataKeyField se utiliza para filtrar las filas en la cuadrícula de detalle. Propiedad DataKeyField
  13. Reemplace el texto del encabezado de la página predeterminada (Cuadrícula maestra – de detalles) con el control Etiqueta de la pestaña Controles Web en el Cuadro de herramientas.
  14. Establezca la propiedad ID de la Etiqueta a Bienvenida. Formulario actualizado
  15. Seleccione la pestaña Código.
  16. Modifique el método del manejador de eventos Page_Load al agregar el siguiente subprograma con código resaltado. El subprograma con código resaltado establece la propiedad Texto de la Etiqueta con el nombre del usuario del usuario actual:

    Sub Page_Load(Sender As Object, E As EventArgs)
    Welcome.Text = “Hello,” + User.Identity.Name
    If Not
    Page.IsPostBack Then
    ‘ Databind the master grid on the first request only
    ‘ (viewstate will restore these values on subsequent postbacks).

    MasterGrid.SelectedIndex = 0
    BindMasterGrid() BindDetailGrid()
    End If
    End Sub

  17. Guarde y ejecute la página ASP.NET.
  18. Su página ASP.NET aparecerá automáticamente en una nueva instancia de su explorador Web. Seleccione una fila en MasterGrid. Observe como DetailsGrid se actualiza con cada fila MasterGrid seleccionada. Observe que el nombre de usuario puede o no mostrarse dependiendo de las configuraciones de seguridad de su sistema de archivos. De manera predeterminada en la mayoría de los servidores, no aparecerá el nombre del usuario — debido a que un usuario que acceda a la página no necesita iniciar la sesión para verla (se permite un acceso anónimo). Cambiaremos estas configuraciones predeterminadas en los siguientes recorridos para obligar a los usuarios a iniciar la sesión. DataGrids maestros / de detalle
  19. Cierre la instancia del explorador Web.

Crear la Página de inicio de sesión: En este recorrido, usted creará una nueva página de inicio de sesión de la aplicación basado en la plantilla del proyecto Página de inicio de sesión. Usted validará a las credenciales de inicio de sesión de un usuario contra la tabla Usuarios en la base de datos MatrixOrders.

  1. Seleccione Nuevo del menú Archivo. Usted verá aparecer el cuadro Agregar nuevo archivo.
  2. Seleccione Seguridad del panel Plantillas.
  3. Seleccione la plantilla Página de inicio de sesión.
  4. Escriba una ruta de archivo en el cuadro Ubicación.
  5. Escriba Login.aspx en el cuadro Nombre de archivo.
  6. Seleccione Visual Basic en el cuadro desplegable Lenguaje.
  7. Haga clic en Aceptar. El archivo Login.aspx se abrirá en la vista Diseño. Diálogo de nuevo archivo
  8. Seleccione la pestaña Código. Nota: El Proyecto de matriz Web ASP.NET ha reemplazado automáticamente el código en el evento LoginBtn_Click para validar los valores UserName y UserPass:

    Sub LoginBtn_Click(Sender As Object, E As EventArgs)
    If
    Page.IsValid Then
    If
    (UserName.Text = “jdoe@somewhere.com“) And (UserPass.Text = “password“) Then
    FormsAuthentication.RedirectFromLoginPage(UserName.Text, true)
    Else

    Msg.Text = “Invalid Credentials: Please try again
    End If
    End If
    End Sub

  9. De la pestaña Asistentes del código en el Cuadro de herramientas, arrastre un Asistente del código SELECCIONAR el Método de datos en la página ASP.NET.
  10. Usted verá que aparece el cuadro Asistente Seleccionar el código de datos.
  11. Seleccione la base de datos (local).MatrixOrders del cuadro desplegable Seleccione una base de datos.
  12. Haga clic en Siguiente.
  13. Seleccione Usuarios en la vista Tablas.
  14. Seleccione el cuadro junto al elemento * en la vista Columnas.
  15. Haga clic en DONDE.
  16. Usted verá que aparece el cuadro Generador de cláusula DONDE.
  17. Seleccione la tabla Usuarios en el menú desplegable Tabla en el panel Operando izquierdo.
  18. Seleccione UserName en la vista Columna. Nota Esta opción establece la porción Operando izquierdo en la cláusula DONDE.
  19. Seleccione el botón de radio Filtro y escriba @nombredelusuario en el cuadro filtro (predeterminado). Nota Esta opción establece la porción Operando derecho de la cláusula DONDE. Usted pasará este valor como un parámetro a la cláusula DÓNDE posteriormente en este recorrido.
  20. Haga clic en Aceptar.
  21. Usted regresará al paso Construya una Consulta SELECCIONAR en el Asistente generador de código.
  22. Haga clic en Y Cláusula.
  23. Usted verá que aparece el cuadro Generardor de consultas.
  24. Seleccione la tabla Users en el menú desplegable Tabla en el panel Operando izquierdo.
  25. Seleccione UserPassword en la vista Columna. Nota Esta opción establece la porción Operando izquierdo de la cláusula DONDE.
  26. Seleccione el botón de radio Filtro y escriba @Contraseñadelusuario en el cuadro filtro (predeterminado). Nota Esta opción establece la porción Operando derecho de la cláusula DONDE. Usted pasará este valor como un parámetro a la cláusula DÓNDE posteriormente en este recorrido.
  27. Haga clic en Aceptar.
  28. Usted regresará al paso Construya SELECCIONAR consulta en el Asistente Generador de código.
  29. Haga clic en Siguiente. Consulta seleccionar usuarios
  30. Usted verá que aparece el paso tres del Asistente Seleccionar código de datos; Vista previa de consulta.
  31. Haga clic en Consulta de la prueba.
  32. Escriba bsmith en el cuadro UserName =.
  33. Escriba bsmith en el cuadro UserPassword =.
  34. Haga clic en Aceptar.
  35. Usted verá la fila Usuarios correspondiente al UserName específico y UserPassword aparecerá en la cuadrícula de resultados del cuadro Vista previa de la consulta. Resultados de la consulta de prueba
  36. Haga clic en Siguiente.
  37. Usted verá aparecer el paso cuatro del Asistente Seleccionar el código de datos; escriba GetUser en el cuadro nombre del método.
  38. Seleccione el botón de radio DataSet.
  39. Haga clic en Finalizar. Ingrese la leyenda
  40. El Asistente se cerrará y la Matriz Web ASP.NET colocará una función llamada GetUser en la vista Código. La función acepta un userName y una userPassword como parámetros de entrada y devuelve un DataSet como el parámetro de salida. DataSet se llena con los datos de detalle del usuario para el userName y la userPassword específicos:

    Function GetUser(ByVal userName As String, ByVal userPassword As String) As System.Data.DataSet

    Dim connectionString As String = “server=’(local)’; trusted_connection=true; database=’MatrixOrders’
    Dim dbConnection As System.Data.IDbConnection = New System.Data.SqlClient.SqlConnection(connectionString)

    Dim queryString As String = “SELECT [Users].* FROM [Users] “& _
    WHERE (([Users].[UserName] = @UserName) AND ([Users"& _
    "].[UserPassword] = @UserPassword))

    Dim dbCommand As System.Data.IDbCommand = New System.Data.SqlClient.SqlCommand
    dbCommand.CommandText = queryString
    dbCommand.Connection = dbConnection

    Dim dbParam_userName As System.Data.IDataParameter = New System.Data.SqlClient.SqlParameter
    dbParam_userName.ParameterName = “@UserName
    dbParam_userName.Value = userName
    dbParam_userName.DbType = System.Data.DbType.String
    dbCommand.Parameters.Add(dbParam_userName)
    Dim dbParam_userPassword As System.Data.IDataParameter = New System.Data.SqlClient.SqlParameter
    dbParam_userPassword.ParameterName = “@UserPassword
    dbParam_userPassword.Value = userPassword
    dbParam_userPassword.DbType = System.Data.DbType.String
    dbCommand.Parameters.Add(dbParam_userPassword)

    Dim dataAdapter As System.Data.IDbDataAdapter = New System.Data.SqlClient.SqlDataAdapter
    dataAdapter.SelectCommand = dbCommand
    Dim dataSet As System.Data.DataSet = New System.Data.DataSet
    dataAdapter.Fill(dataSet)

    Return dataSet

    End Function

  41. Actualizar el método del manejador de eventos al hacer clic en el Botón y agregar los subprogramas de código resaltados de tal manera que valide la entrada del usuario contra los resultados de invocar la función GetUser:

    Sub LoginBtn_Click(Sender As Object, E As EventArgs)
    If
    Page.IsValid Then
    Dim userDS As New System.Data.DataSet
    userDS = GetUser(UserName.Text, UserPass.Text)

    If userDS.Tables(0).Rows.Count = 1 Then

    FormsAuthentication.RedirectFromLoginPage(UserName.Text, false)
    Else

    Msg.Text = “Invalid Credentials: Please try again
    End If
    End If
    End Sub

  42. Guarde y regrese a la página Inicio de sesión.
  43. Su página de Inicio de sesión aparecerá automáticamente en una nueva instancia de su explorador Web.
  44. Escriba bsmith en los cuadros Username y Password y haga clic en Inicio de sesión. Introducir las credenciales
  45. De manera predeterminada, la página Inicio de sesión enviará al usuario a la página llamada Default.aspx en un inicio de sesión exitoso. Inicio de sesión exitoso
  46. Cierre la instancia del explorador Web.
  47. Escriba bsmith en el cuadro de texto Username.
  48. Escriba 1234 ó cualquier otro texto, excepto la contraseña correcta bsmith en el cuadro Contraseña.
  49. Presione Intro.Nota La página de Inicio de sesión mostrará un mensaje de error si usted proporciona las credenciales que no existen en la tabla Usuarios.
  50. Cierre la instancia del explorador Web.
  51. Cierre la página Login.aspx .

Crear Archivo WebConfig:
En este recorrido, usted creará un archivo Web.config que se utilizará para configurar su Aplicación Web:

  • Recopile las credenciales utilizando un formulario HTML directamente del cliente (esto es, una Autenticación basada en formularios)
  • Evite el acceso de usuarios Web anónimos

Cuando se usa junto con la Página Login.aspx que acabamos de crear, nos permitirá obligar a los usuarios a iniciar la sesión exitosamente antes de visitar nuestra página de reporte de datos maestros / de detalle. Para permitir esto, siga los siguientes pasos:

  1. Seleccione Nuevo del menú Archivo. Usted verá que aparece el cuadro Agregar nuevo archivo.
  2. Seleccione (General) del panel Plantillas.
  3. Seleccione la plantilla Web.Config.
  4. Escriba una ruta de archivo en el cuadro Ubicación.
  5. Escriba Web.config en el cuadro Nombre de archivo (predeterminado).
  6. Haga clic en Aceptar. Se abrirá el archivo Web.Config. Nueva configuración del Web
  7. Localice el siguiente subprograma de código.

    <!–

    La <autenticación> permite la configuración del modo de autenticación de seguridad
    utilizado por ASP.NET para identificar a un usuario entrante. Brinda soporte a el atributo “modo”
    con cuatro valores válidos: “Windows”, “Formularios”, “Contraseña” y “Ninguno”:

    La sección <formularios> es una subsección de la sección <autenticación>,
    y permite configurar los valores de autenticación utilizados cuando se activa la autenticación Formularios
    anterior:

    <authentication mode=”Windows”>

    <forms name=”.aspx AUTH”
    loginUrl=”login.aspx “
    protection=”Validation”
    timeout=”999999″ />

    </authentication>
    –>

  8. Sin comentario para la etiqueta <autenticación>. El subprograma de código resultante debe ser:

    <!–

    La sección <autenticación> permite la configuración del modo de autenticación de seguridad
    utilizado por ASP.NET para identificar a un usuario entrante. Da soporte a un atributo de “modo”
    con cuatro valores válidos: “Windows”, “Formularios”, “Contraseña” y “Ninguno”:

    La sección <formularios> es una subsección de la sección <autenticación>,
    y permite configurar los valores de autenticación utilizados cuando se activa la autenticación Formularios
    anterior:

    –>

    <authentication mode=”Windows”>

    <forms name=”.aspx AUTH”
    loginUrl=”login.aspx “
    protection=”Validation”
    timeout=”999999″ />

    </authentication>

  9. Localice el siguiente atributo de modo y establezca el atributo modo de la etiqueta autenticación en Formularios (el predeterminado es Ventanas). Esta sección establece las pólizas de autenticación de la aplicación:

    <authentication mode=”Windows”>

    <forms name=”.aspx AUTH”
    loginUrl=”login.aspx “
    protection=”Validation”
    timeout=”999999″ />

    </authentication>

  10. La etiqueta de <autenticación> resultante de ser:

    <authentication mode=”Forms”>

    <forms name=”.aspx AUTH”
    loginUrl=”login.aspx “
    protection=”Validation”
    timeout=”999999″ />

    </authentication>


    Nota:
    La autenticación basada en Formularios es un servicio de autenticación ASP.NET que permite a las aplicaciones proporcionar su propia interfaz de inicio de sesión y hacer su propia verificación de credenciales.

    Nota: El atributo modo es sensible a mayúsculas y minúsculas. mode=”forms” no funcionará.

  11. Sin comentarios para la etiqueta <autorización>.
  12. Elimine las subetiquetas permitir (predeterminado) de la etiqueta autorización. Esta sección establece las políticas de autorización de la aplicación:

     

    <allow users="joeuser" />
    <allow roles="Admins" />

    Nota: Usted puede permitir o rechazar el acceso a los recursos de la aplicación por usuario o rol.

  13. Establezca la sub-etiqueta negar de la etiqueta autorización en ? (la configuración predeterminada es *):

    <deny users=”?” />

    Nota: Además de los nombres de usuario o rol, usted puede especificar uno de los siguientes valores comodín: “*” significa todos, “?” significa anónimo. Negar el acceso de los usuarios anónimos a las páginas dentro del directorio bloquea a cualquier usuario que no haya iniciado la sesión al visitar una página — y en lugar de esto lo enviará a la página de inicio de sesión creada anteriormente. No tendrán acceso a ninguna página hasta que introduzcan adecuadamente su nombre de usuario/contraseña en la página inicio de sesión.

  14. Guardar el archivo. Nota: Usted no puede ejecutar un archivo Web.config.
  15. Cierre el archivo.

Crear la página Registro: En este recorrido, usted creará una nueva Página ASP.NET que guardará la información del nuevo usuario en la tabla Usuarios.

  1. Seleccione Nuevo del menú Archivo. Usted verá que aparece el cuadro Agregar nuevo archivo.
  2. Seleccione (General) desde el panel Plantillas (predeterminado).
  3. Seleccione la plantilla Página ASP.NET (predeterminado).
  4. Escriba la ruta del archivo en el cuadro Ubicación.
  5. Escriba NewUser.aspx en el cuadro Nombre de archivo.
  6. Seleccione Visual Basic en el cuadro desplegable Lenguaje (predeterminado).
  7. Haga clic en Aceptar. El archivo NewUser.aspx se abrirá en la vista Diseño.
  8. De la pestaña Controles Web en el Cuadro de herramientas, arrastre tres controles de Etiqueta, dos controles TextBox y un control Botón a la Página ASP.NET. Agregue los Controles Web básicos
  9. Establezca la propiedad Texto en la parte superior de Etiquetas en UserName:.
  10. Establezca la propiedad Texto de la Etiqueta intermedia en UserPassword:.
  11. Establezca la propiedad Texto en la parte inferior de Etiqueta para vaciarlo (sin texto).
  12. Establezca la propiedad ID de la Etiqueta inferior en Mensaje.
  13. Establezca la propiedad ID en la parte superior de TextBox en txtUserName.
  14. Establezca la propiedad ID del botón TextBox en txtUserPassword.
  15. Establezca la propiedad TextMode de la contraseña del usuario TextBox en Contraseña. Nota Esta propiedad obtiene o establece el modo de comportamiento del cuadro de texto. En esta instancia, debido a que la contraseña es sensible a la información, TextBox cubrirá automáticamente la entrada del usuario.
  16. Seleccione la pestaña Código.
  17. De la pestaña Asistentes de código en el Cuadro de herramienta, arrastre un Asistente de código INSERTAR el Método de datos a la Página ASP.NET. Inserte el Generador de código
  18. Usted verá que aparece el paso uno del Asistente INSERTAR el código de datos; el cual invoca el cuadro Seleccione una conexión de base de datos.
  19. Seleccione la base de datos MatrixOrders y después haga clic en Siguiente.
  20. Usted verá que aparece el paso dos del Asistente INSERTAR el código de datos; el cual invoca el cuadro Construir una Consulta INSERTAR.
  21. Seleccionar Usuarios en la vista Tablas. Nota Deje los cuadros de Columna en sus valores predeterminados.
  22. Haga clic en Siguiente. Inserte el diálogo de consulta
  23. Usted verá que aparece el paso tres de Asistente INSERTAR el código de datos; el cual invoca el cuadro Método del nombre. Escriba AddUser en el cuadro nombre del método.
  24. Haga clic en Finalizar. Ingrese la leyenda
  25. El Asistente se cerrará y la Matriz Web ASP.NET colocará una función llamada AddUser en la vista Código. La función acepta un userName y una userPassword como parámetros de entrada y devuelve un Integral como parámetro de salida. El valor Integral representará el número total de las filas afectadas:

    Function AddUser(ByVal userName As String, ByVal userPassword As String) As Integer

    Dim connectionString As String = “server=’(local)’; trusted_connection=true; database=’MatrixOrders’
    Dim dbConnection As System.Data.IDbConnection = New System.Data.SqlClient.SqlConnection(connectionString)

    Dim queryString As String = “INSERT INTO [Users] ([UserName],“& _
    [UserPassword]) VALUES (@UserName, @UserPassword)

    Dim dbCommand As System.Data.IDbCommand = New System.Data.SqlClient.SqlCommand
    dbCommand.CommandText = queryString
    dbCommand.Connection = dbConnection

    Dim dbParam_userName As System.Data.IDataParameter = New System.Data.SqlClient.SqlParameter
    dbParam_userName.ParameterName = “@UserName
    dbParam_userName.Value = userName
    dbParam_userName.DbType = System.Data.DbType.String
    dbCommand.Parameters.Add(dbParam_userName)
    Dim dbParam_userPassword As System.Data.IDataParameter = New System.Data.SqlClient.SqlParameter
    dbParam_userPassword.ParameterName = “@UserPassword
    dbParam_userPassword.Value = userPassword
    dbParam_userPassword.DbType = System.Data.DbType.String
    dbCommand.Parameters.Add(dbParam_userPassword)

    Dim rowsAffected As Integer = 0
    dbConnection.Open
    Try
    rowsAffected = dbCommand.ExecuteNonQuery
    Finally
    dbConnection.Close
    End Try

    Return rowsAffected

    End Function

  26. Seleccione la pestaña Diseño.
  27. Haga doble clic en el control Botón. El Proyecto de Matriz Web ASP.NET abrirá la vista Código en el evento Button1_Click.
  28. Agregue el subprograma de código en rojo al cuerpo del evento hacer clic en Botón de tal manera que invoque la función AddUser, pasando los valores TextBox como los parámetros UserName y UserPassword:

    Sub Button1_Click(sender As Object, e As EventArgs)

    If AddUser(txtUserName.Text, txtUserPassword.Text) > 0
    Message.Text = “Success”
    Else

    Message.Text = “Failure”
    End If

    End Sub

  29. Abra el archivo web.con fig.
  30. Agregue el subprograma del código en rojo a la etiqueta <configuración>, eso permitirá que todos tengan acceso a la Página NewUser.aspx .Nota: Coloque el subprograma del código fuera de las etiquetas <system.web>…</system.web>

    <location path=”NewUser.aspx “>
    <system.web>
    <authorization>
    <allow users=”*” />
    </authorization>
    </system.web>
    </location>

  31. Guarde y cierre el archivo web.con fig.
  32. Guarde y ejecute la Página ASP.NET NewUser.aspx.
  33. Su página ASP.NET aparecerá automáticamente en una nueva instancia de su explorador Web.
  34. Escriba el nuevo nombre del usuario en el cuadro UserName.
  35. Escriba una contraseña al usuario en el cuadro UserPassword.
  36. Haga clic en el Botón. Nota La Etiqueta del mensaje contendrá el estado para insertar el nuevo usuario.Guarde el Nuevo usuario
  37. Cierre la instancia del explorador Web.
  38. Abra el archivo Login.aspx que desarrolló anteriormente en este recorrido. Así, usted proporcionará al usuario la opción de ejecutar la Página NewUser.aspx si están incorrectas sus credenciales de inicio de sesión.
  39. Seleccione la pestaña Código.
  40. Modifique el código del evento Hacer clic en el botón Inicio de sesión de tal manera que proporcione un vínculo a la Página New User en el texto Etiqueta del mensaje:

    Msg.Text = “Invalid Credentials: Please try again or ” + _ “<a ref=’newuser.aspx ‘>register a new user</a>”

  41. Guarde y ejecute la Página ASP.NET.
  42. Su página ASP.NET aparecerá automáticamente en una nueva instancia de su explorador Web.
  43. Escriba un nombre de usuario inválido en el cuadro UserName.
  44. Escriba una contraseña del usuario en el cuadro UserPassword.
  45. Haga clic en el Botón. Nota Ahora el usuario tiene la opción de proporcionar las credenciales válidas del inicio de sesión o seguir el vínculo registrar un nuevo usuario.Usuario inválido
  46. Cierre la instancia del explorador Web.
  47. Cierre el Proyecto de la Matriz Web ASP.NET.

Ejecutar la aplicación: En este recorrido, usted ejecutará la Aplicación Web desarrollada en este recorrido. El punto de entrada a la aplicación es la página Predeterminada.

  1. Abra el archivo Default.aspx .
  2. Ejecute la página ASP.NET.
  3. Su página ASP.NET aparecerá automáticamente en una nueva instancia de su explorador Web.
  4. Debido a que es la primera vez en la que ha accedido al sitio, no tendrá acceso a la página (ya que no ha iniciado la sesión). Automáticamente, ASP.NET lo enviará a la página de inicio de sesión — en donde puede introducir sus credenciales existentes de nombre de usuario/contraseña — o hacer clic en el vínculo del registro para crear una nueva cuenta. Una vez que ha iniciado la sesión, podrá regresar a la página default.aspx en donde tendrá acceso al sitio restringido.

Fuente: Universiadad .net
http://www.microsoft.com/spanish/msdn/comunidad/uni.net/

« Entradas Recientes

Categorías