Blog de Jorge Pedraza

enero 23, 2012

Unicidad de Acceso de Usuario en ASP.NET

Filed under: Aplicaciones Web,Seguridad — JorgePedraza @ 6:14 am
Tags:

Hola, el presente artículo tiene como finalidad resaltar una técnica fácil y sencilla de implementar para validar la unicidad de acceso de cuentas de usuarios contra determinada solución ASP.NET.

La idea principal es reproducir y validar el escenario de cuando uno o más usuarios inician sesión con una misma cuenta de usuario (Login y Password) de forma concurrente o recurrente, contra determinada sitio web de ASP.NET a través de la autenticación por formulario.

Un ejemplo clásico de esto es el sistema Login Windows Live  ID de Hotmail, el cual lleva un mecanismo bien estructurado para permitir múltiples variantes de Login con una determinada cuenta de usuario.

Entonces a continuación se detalla la técnica.
Requisitos:
1.    Microsoft Visual Studio 2010 con SP 1
2.    Experiencia con Lenguaje Visual Basic 2010 o C# 2010
3.    Conocimiento fundamental de Autenticación por formulario de ASP.NET

Elementos claves de la técnica de Unicidad:
1.    Soporte de Autenticación por formulario de ASP.NET
2.    Objeto Application de ASP.NET
3.    Objeto Session de ASP.NET
4.    Propiedad SessionID del Objeto Session (HttpSessionState)

Descripción de la técnica de Unicidad:
Por defecto la técnica se enfoca en mantener un registro de los usuarios autenticados de forma global a través de objeto Application para ser usado en combinación con el Objeto Session de cada usuario anónimamente único.
Para estos se inicia con el formulario Login.aspx, donde una vez validado el usuario se procede a usar el siguiente fragmento de código:

Dim iduser As String = “1”
Dim cadusuario As String = “Demo”

Me.Session("usuario") = cadusuario
Me.Session("id_usuario") = iduser

Application.Lock()
If Application.Item(iduser) Is Nothing Then
    Application.Add(iduser, Me.Session.SessionID.ToString)
Else
    Application.Item(iduser) = Me.Session.SessionID.ToString
End If
Application.UnLock()
System.Web.Security.FormsAuthentication.RedirectFromLoginPage(cadusuario, False)

 

Ahora desde determinada página formulario WebForm o página maestra Site.Master se puede usar el evento Init para colocar el siguiente código:

If Session("id_usuario") Is Nothing OrElse Application(Session("id_usuario")) <> Me.Session.SessionID.ToString() Then
   ‘CerrarSesion()
   lblmensajemain.Text = "Atención otro usuario ha iniciado sesión con la actual cuenta de Usuario, consulte con el Administrador"
End If

Finalmente se concreta la técnica, la cual puede llegar a ofrecer a los usuarios una advertencia o cierre abrupto de la sesión dejando en teoría solo la última sesión activa valida vinculado con determinada cuenta de usuario autenticado.

Nota Importante: Esta técnica fue probado en diferentes navegadores, entornos y frecuencias de tiempo, el cual ha obtenido excelente resultado. De toda manera si usted presenta alguna anomalía, por favor póngase en contacto conmigo para estudiar toda alternativa de reestructuración de la misma.

Código fuente:

En Resumen:

Esta alternativa permite construir soluciones Web más escalable y segura sin necesidad de recurrir a complejo mecanismo de persistencias de datos, para hacer seguimiento de sesiones de usuarios autenticados de forma consistente.

Enlaces de Interés:

  1. HttpSessionState Class
  2. HttpSessionState.SessionID Property
  3. HttpApplicationState Class
  4. How to: Implement Simple Forms Authentication

abril 11, 2011

Autenticación y Autorización de ASP.NET

Filed under: Seguridad — JorgePedraza @ 7:36 am
Tags: , , ,

Hola, la presente de este artículos es para resaltar de forma rápida y sencilla uno de los temas de seguridad en ASP.NET.

Dentro de la seguridad de ASP.NET se menciona el siguiente esquema fundamental:

  1. Autenticación
  2. Autorización

Autenticación: Es el mecanismo para validar las credenciales de usuario (Nombre y Clave) contra el acceso de un sitio web.

Descripción de la Autenticación:

Este mecanismo generalmente representa una interfaz de solicitud y validación de credenciales de usuarios, para aquellos usuarios que intenta ingresar a un sitio Web protegido.

Tipos de Autenticación:

Tipos

Descripción

Windows

Valida credenciales de usuarios contra las cuentas de usuarios de Microsoft Windows

Formulario

Valida credenciales de usuario contra cualquier repositorio de datos estándar.

Directorio Activo

Valida credenciales de usuario contra el Directorio activo de la red empresarial

Membership

Valida credenciales de usuario contra origen de datos especifico, por excelencia Microsoft SQL Server

Windows Identity Foundation

Valida credenciales de usuarios contra un servicio estandarizado de forma global en la Red.

Parámetros Básico de la Autenticación en ASP.NET (Web.config):

<system.web>

  <authentication mode="Forms">
    <forms loginUrl="login.aspx"></forms>
  </authentication>

  <authorization>
    <deny users="?">
  </authorization>

</system.web>

Ahora que conoce el mecanismo de Autenticación, se continua en el siguiente paso: El acceso autorizado a recursos con la Autorización en ASP.NET

Autorización: Es el mecanismo que establece permisos de acceso a recursos dentro del sitio Web para usuarios ya autenticados.

Descripción de la Autorización:

Este mecanismo toma como patrón base el sistema tradicional de Roles y Reglas de Acceso, donde cada Rol contiene un conjunto de reglas de acceso para usar dentro del sitio Web. Por ejemplo:

Roles

Reglas de Acceso

Administrador

Obtiene acceso a todos los recursos del sitio Web

Usuario

Obtiene acceso a cierto recursos del sitio Web

Invitado

Obtiene acceso a recursos básico del sitio Web

Parámetros Básicos de la Autorización en ASP.NET (Web.Config):

<system.web>

  <authorization>
    <allow roles="Finanzas, Administradores" />
    <allow users="Mario, Pedro" />
    <deny users=" * "/>
  </authorization>

</system.web>

Puntos claves para optimizar la Autenticación y Autorización de ASP.NET:

  • Validar la unicidad de las credenciales de usuarios contra el acceso de determinado sitio Web.
  • Evitar el uso de Query String para manipular información sensible de determinado usuario.
  • Proteger la entrada de datos contra XSS (Cross-Site-scripting).
  • Usar comandos parametrizado contra origen de datos.
  • Evitar el uso de Query dinámico a nivel de procedimientos almacenado.
  • Usar certificado digital SSL en ciertos módulos Web de extremada privacidad.

Código Fuente de Interés:

Links de Interés:

enero 29, 2011

Funcion Cifrado .NET

Filed under: Seguridad — JorgePedraza @ 10:50 am
Tags: , , , ,

FUNCIÓN CIFRADO .NET

El Presente articulo explica como crear y utilizar una función genérica dentro de la Plataforma .NET para encriptar y desencriptar datos, en general cadena de caracteres; utilizando un algoritmo genérico que hace uso de los diferentes estándares de servicio de cifrado que proporciona el .NET Framework.

  • DES (Digital Encryption Standard)
  • Triple Des
  • Rijndael
  • RC2

Indice:

Requerimientos:

  • Sistema Operativo Windows XP o Superior
  • Sistema de Desarrollo Microsoft Visual Studio 2010

La Función descrita en este articulo, solo se requiere que tenga conocimiento de la herramienta de desarrollo Microsoft Visual Basic 2010

Introducción:

La criptografía impide la visión o modificación de los datos, y ofrece canales de comunicación seguros que de lo contrario resultarían inseguros. Por ejemplo, los datos pueden cifrarse usando un algoritmo criptográfico estandar, durante la transmisión de información en la red. Sí un tercero intercepta los datos cifrados, le resultará difícil descifrarlos.

Primitiva criptográfica
Uso
Cifrado de clave secreta (criptografía simétrica) Realiza la transformación de los datos, impidiendo que terceros los lean. Este tipo de cifrado utiliza una clave secreta compartida para cifrar y descifrar los datos.
Cifrado de clave pública (criptografía asimétrica) Realiza la transformación de los datos, impidiendo que terceros los lean. Este tipo de cifrado utiliza un par de claves pública y privada para cifrar y descifrar los datos.
Firmas criptográficas Garantiza que los datos se originen en una parte específica mediante la creación de una firma digital única para esa parte. En este proceso también se usan funciones hash.
Valores hash criptográficos Asigna datos de cualquier longitud a una secuencia de bytes de longitud fija. Los valores hash son únicos estadísticamente; el valor hash de una secuencia de dos bytes distinta no será el mismo.

Para el caso del algoritmo de nuestra Función Cifrado.NET, se utilizo la modalidad Cifrado de clave secreta (criptografía simétrica).

Los algoritmos de cifrado de clave secreta utilizan una clave secreta única para cifrar y descifrar datos. Debe asegurarse de que agentes no autorizados no obtengan acceso a la clave puesto que podrían utilizarla para descifrar los datos.

Normalmente, los algoritmos de clave secreta, denominados de cifrado de bloques, se utilizan para cifrar un bloque de datos a la vez. Los cifrados de bloques (como RC2, DES, TripleDES y Rijndael) transforman criptográficamente un bloque de entrada de n bytes en un bloque de salida de bytes cifrados. Si desea cifrar o descifrar una secuencia de bytes, debe hacerlo bloque a bloque. Como el tamaño de n es pequeño (n = 8 bytes para RC2, DES y TripleDES; n = 16, el valor predeterminado; n = 24; o n = 32 bytes para Rijndael), los valores mayores que n deben cifrarse en un bloque cada vez.

Las clases de cifrado de bloques que ofrece la biblioteca de clases base utilizan un modo de encadenamiento denominado CBC (Cipher Block Chaining, encadenamiento de bloques de cifrado), que utiliza una clave y un IV (Initialization Vector, vector de inicialización) para realizar transformaciones criptográficas en los datos.

.NET Framework proporciona las siguientes clases que implementan algoritmos de cifrado de clave secreta:

  • DESCryptoServiceProvider
  • RC2CryptoServiceProvider
  • RijndaelManaged
  • TripleDESCryptoServiceProvider

Objetivo General :

Para que el algoritmo funcione correctamente dentro de la Plataforma .NET; se necesita de lo siguiente: El uso de una Cadena de Caracteres de entrada de Datos, Key (Clave secreta) y IV (Initialization Vector), Cuya longitud debe variar de acuerdo con el servicio de cifrado que haya seleccionado dentro la función; por que de lo contrario se producirá una excepción.

Tabla de Longitudes de los Parametros

Clase
Soporte de Longitud Key (Clave Secreta)
Ejemplo

DES

8 Byte

  • Key = “Password”
  • IV = “Password”

Triple Des

16 o 24 Byte

  • Key = “password12345678”
  • IV = “password12345678”

Rijndael

16 Byte

  • Key = “1234567891234567”
  • IV = “1234567891234567”

RC2

16 Byte

  • Key = “1234567891234567”
  • IV = “1234567891234567”

Especificación del Algoritmo:

Para efecto de nuestro algoritmo; se debe utilizar las siguientes clase del Framework:

  • System.Security.Cryptography (El espacio de nombres System.Security.Cryptography proporciona servicios de cifrado, entre los que se incluyen la codificación y descodificación segura de los datos y otras muchas operaciones como, por ejemplo, la técnica de dispersión o hashing, la generación de números aleatorios y la autenticación de mensajes).
  • System.Text (El espacio de nombres System.Text contiene clases que representan codificaciones de caracteres ASCII, Unicode, UTF-7, y UTF-8; clases base abstractas para la conversión de bloques de caracteres en bloques de bytes y viceversa; y una clase auxiliar que manipula y da formato a objetos String sin necesidad de crear instancias intermedias de String).
  • System.IO (El espacio de nombres System.IO contiene tipos que permiten leer y escribir en los archivos y secuencias de datos, así como tipos que proporcionan compatibilidad básica con los archivos y directorios. )
Clase
Descripción
System.Security.Cryptography
  • ICryptoTransform: Define las operaciones básicas de las transformaciones criptográficas.
  • CryptoStream: Especifica el modo de una secuencia criptográfica
System.Text
  • Encoding:Representa una codificación de carácter.
System.IO
  • MemoryStream:Crea una secuencia cuyo almacén de respaldo es la memoria.

Demostración del Código:

Breve configuración de la función Cifrado:

  • Modo:
    • 1 es Encriptar;
    • 2 es Desencriptar
  • Algoritmo:
    • 1 es DES
    • 2 es TripleDES
    • 3 es RC2
    • 4 es Rijndael
  • Cadena: Es la Cadena de Caracter a Cifrar.
  • Key: Clave Secreta
  • VecI: Vector de Inicialización

Imports System.Security.Cryptography

Imports System.Text

imports System.IO

Module Module1

Public Function Cifrado(ByVal modo As Byte, ByVal Algoritmo As Byte, ByVal cadena As String, ByVal key As String, ByVal VecI As String) As String

Dim plaintext() As Byte

If modo = 1 Then

plaintext = Encoding.ASCII.GetBytes(cadena)

ElseIf modo = 2 Then

plaintext = Convert.FromBase64String(cadena)

End If

Dim keys() As Byte = Encoding.ASCII.GetBytes(key)

Dim memdata As New MemoryStream

Dim transforma As ICryptoTransform

Select Case Algoritmo

Case 1

Dim des As New DESCryptoServiceProvider ‘ DES

des.Mode = CipherMode.CBC

If modo = 1 Then

transforma = des.CreateEncryptor(keys, Encoding.ASCII.GetBytes(VecI))

ElseIf modo = 2 Then

transforma = des.CreateDecryptor(keys, Encoding.ASCII.GetBytes(VecI))

End If

Case 2

Dim des3 As New TripleDESCryptoServiceProvider ‘TripleDES

des3.Mode = CipherMode.CBC

If modo = 1 Then

transforma = des3.CreateEncryptor(keys, Encoding.ASCII.GetBytes(VecI))

ElseIf modo = 2 Then

transforma = des3.CreateDecryptor(keys, Encoding.ASCII.GetBytes(VecI))

End If

Case 3

Dim rc2 As New RC2CryptoServiceProvider ‘RC2

rc2.Mode = CipherMode.CBC

If modo = 1 Then

transforma = rc2.CreateEncryptor(keys, Encoding.ASCII.GetBytes(VecI))

ElseIf modo = 2 Then

transforma = rc2.CreateDecryptor(keys, Encoding.ASCII.GetBytes(VecI))

End If

Case 4

Dim rj As New RijndaelManaged ‘Rijndael

rj.Mode = CipherMode.CBC

If modo = 1 Then

transforma = rj.CreateEncryptor(keys, Encoding.ASCII.GetBytes(VecI))

ElseIf modo = 2 Then

transforma = rj.CreateDecryptor(keys, Encoding.ASCII.GetBytes(VecI))

End If

End Select

Dim encstream As New CryptoStream(memdata, transforma, CryptoStreamMode.Write)

encstream.Write(plaintext, 0, plaintext.Length)

encstream.FlushFinalBlock()

encstream.Close()

If modo = 1 Then

cadena = Convert.ToBase64String(memdata.ToArray)

ElseIf modo = 2 Then

cadena = Encoding.ASCII.GetString(memdata.ToArray)

End If

Return cadena ‘Aquí Devuelve los Datos Cifrados

End Function

End Module


screenshotCDCS

Cadena1 = Cifrado(1,1,”Usuario Demo”,”eeaataxz”,”eeaataxz”) –> Aquí se Encripta

Cadena2 = Cifrado(2,1,Cadena1,”eeaataxz”,eeaataxz”) –> Aquí se Desencripta

Cadena1 = “mR6A9ViW8f5BHtJgNEK78w==”

Cadena2 = “Usuario Demo”


Código Fuente:

Conclusión: Con esta función se pretende obtener una mayor ventaja de las herramientas que proporciona el .NET framework, de una forma rápida y segura para aquellos que desean cifrar información con tan solo invocar una instrucción previamente configurada.

Fuentes:

Blog de WordPress.com.