Autenticacion de usuarios en asp.net


En ciertas ocasiones, necesitamos que nuestra aplicación web ASP.NET disponga de un sistema de autenticación básica de usuarios para realizar, por ejemplo, tareas administrativas de configuración a través de un módulo de administración integrado que solo sea accesible para usuarios autenticados. Para este escenario en concreto, bastaría con implementar un simple sistema de Login para que el o los encargados de administrar la aplicación puedan autenticarse mediante su usuario y contraseña en el sistema.

En este Post veremos cómo crear un sistema de Login basado en FormsAuthentication con encriptado de contraseña, y como integrarlo en una aplicación web ASP.NET MVC. También veremos como solucionar los problemas derivados de publicar nuestra aplicación en un Web hosting en clúster con balanceo de carga.

Nota: Antes de comenzar a desarrollar el Post, comentar que este ejemplo está desarrollado en ASP.NET MVC4 Framework 4.0 aunque también es perfectamente compatible con aplicaciones ASP.NET MVC5  Framework 4.5.

FormsAuthentication (Web.config)

En primer lugar crearemos el o los usuarios administradores de la aplicación. Este proceso lo realizamos en el elemento <authentication/>, dentro de la sección <system.web/> del archivo de configuración Web.config de la aplicación.

<authentication mode="Forms">
  <forms name=".ASPXAUTH" loginUrl="~/Login" timeout="10000">
    <credentials passwordFormat="SHA1">
      <user name="usuario" password="contraseña-encriptada" />
      <!-- Otros usuarios aquí... -->          
    </credentials>
  </forms>
</authentication>

mode="Forms": Habilita la autenticación mediante formularios.

name=".ASPXAUTH": Nombre de la Cookie que contendrá el Ticket de autenticación.

loginUrl="~/Login":  URL de redirección, en el caso de que ASP.NET no encuentre la Cookie de autenticación.

timeout="10000": Tiempo de expiración de la Cookie de autenticación expresado en minutos.

passwordFormat="SHA1": Algoritmo de encriptación de las contraseñas de usuario (SHA1 hash).

name="admin": Nombre del usuario.

password="contraseña-encriptada": Contraseña del usuario encriptada en formato SHA1 (más adelante veremos como realizar el proceso de encriptación).

El Controlador y las Vistas

A continuación crearemos la infraestructura necesaria para desarrollar el sistema de autenticación y administración de la aplicación.

Creamos un Controlador básico con las Acciones necesarias para el sistema de Login y las tareas administrativas (posteriormente implementaremos el código para cada una de estas Acciones).

    public class AdminController : Controller
    {
        // GET: Admin
        public ActionResult Index()
        {
            // Aquí acceso al módulo de administración...
            return View();
        }

        // GET: Admin/Login
        public ActionResult Login()
        {
            // Aquí acceso a la 'Vista' de Login...
            return View();
        }

        // POST: Admin/Login
        [HttpPost]
        public ActionResult Login(string usr, string pwd, string rme)
        {
            // Aquí lógica de autenticación...
            return View();
        }

        // GET: Admin/Logout
        public ActionResult Logout()
        {
            // Aquí lógica de desconexión...
            return View();
        }
    }

Creamos también las Vistas (por supuesto siempre dentro del directorio de referencia del ControladorViews\Admin\). Para este ejemplo necesitaremos 2 Vistas: Login.cshtml e Index.cshtml.

Login.cshtml: Vista que contendrá el formulario de autenticación de usuarios. Este sería un ejemplo básico de Login mediante usuario y contraseña con la opción Remember me, basado en Bootstrap 3.2:

<div class="container-fluid">
    <div class="row">
        <div class="col-sm-6 col-md-4 col-md-offset-4">
            <div class="text-center">
                <div class="text-center">
                    <img class="img-thumbnail" src="~/Images/admin.png" width="128">
                </div>
                <br />
                @using (Html.BeginForm("Login","Admin"))
                {                
                    <input type="text" class="form-control" name="usr" 
                           placeholder="Usuario" required autofocus>
                    <br />
                    <input type="password" class="form-control" name="pwd" 
                           placeholder="Contraseña" required>
                    <br />
                    <button class="btn btn-lg btn-primary btn-block" type="submit">
                        Iniciar sesión
                    </button>
                    <label class="checkbox pull-left">
                        <input type="checkbox" name="rme" checked="">
                        <label>Remember me</label>
                    </label>                
                }
            </div>
        </div>
    </div>
</div>

Index.cshtml: Esta sería la Vista principal del módulo de administración. En un caso práctico podría ser un panel de control al estilo AdminLTE.

El código para la autenticación

Por último, solo quedaría codificar las Acciones del Controlador para dar la funcionalidad de autenticación al sistema de Login.

Esto lo haremos a través de la clase FormsAuthentication del espacio de nombres System.Web.Security. Esta clase proporciona una serie de métodos estáticos que interactuan con la configuración anteriormente establecida en el Web.config <authentication/>.

A continuación el código:

    public class AdminController : Controller
    {
        // GET: Admin
        public ActionResult Index()
        {
            if (this.Request.IsAuthenticated)
            {
                // Si el usuario está autenticado 
                // retorna la Vista de administración.
                return View();
            }
            else
            {
                // Si no, retorna la Vista de Login.
                return RedirectToAction("Login", "Admin");
            }
        }

        // GET: Admin/Login
        public ActionResult Login()
        {
            // Retorna la Vista de Login
            return View();
        }

        // POST: Admin/Login
        [HttpPost]
        public ActionResult Login(string usr, string pwd, string rme)
        {
            if (string.IsNullOrEmpty(usr) || string.IsNullOrEmpty(pwd))
            {
                return View();
            }
            else
            {
                bool _rememberMe = rme == "on" ? true : false;

                // Valida el usuario con los registrados en la
                // seccion <authentication/> del Web.config
                if (FormsAuthentication.Authenticate(usr, pwd))
                {
                    // Crea la Cookie con el Ticket de autenticación 
                    // para el usuario.
                    FormsAuthentication.SetAuthCookie(usr, _rememberMe);
                    // Redirige a la Accion 'Index'
                    return RedirectToAction("Index");
                }
                else
                {
                    // Si no es un usuario válido, retorna la
                    // Vista de Login.
                    return View();
                }
            }
        }

        // GET: Admin/Logout
        public ActionResult Logout()
        {
            // Elimina la Cookie con el Ticket de autenticación 
            // para el usuario.
            FormsAuthentication.SignOut();
            // Redirige a la Accion 'Index'
            return this.RedirectToAction("Index");
        }
    }

Encriptado de contraseña

Siempre es una buena práctica encriptar las contraseñas y datos sensibles de nuestra aplicación, a la hora de publicarla en un Web hosting externo a nuestra infraestructura corporativa. En el caso que nos ocupa, habíamos configurado la sección <authentication/> para utilizar contraseñas de usuario en formato SHA1 hash. Un ejemplo real con nombre de usuario ‘admin‘ y contraseña ‘admin‘, sería el siguiente:

<credentials passwordFormat="SHA1">
   <user name="admin" password="D033E22AE348AEB5660FC2140AEC35850C4DA997" />
</credentials>

Existen infinidad de páginas en Internet que generan online la cadena encriptada de caracteres SHA1 a partir de un texto dado, http://www.sha1-online.com es un ejemplo de estas.

Publicando nuestra aplicación (Web hosting)

En este punto ya hemos integrado el sistema de autenticación a nuestra aplicación ASP.NET MVC y todo funciona correctamente en nuestro servidor IIS local o de desarrollo. Es la hora entonces de publicar la aplicación en los servidores web de nuestro proveedor de hosting

Comenzamos a testear la aplicación, nos autenticamos en el sistema (Login), navegamos a través de las páginas que requieren usuarios autenticados, y en pocos minutos (o segundos) vemos como hemos perdido la autenticación y la aplicación nos redirige a la página de Login. Afortunadamente este es un problema muy común y de fácil solución.

El problema

Los proveedores de servicios de hosting funcionan con granjas de servidores web (Clustering) que implementan balanceo de carga para maximizar el rendimiento de las peticiones http y minimizar la carga de trabajo.

Cuando nos autenticamos en nuestra aplicación (Login), el servidor que atiende la petición crea un Ticket de autenticación que se almacena en una cookie que es enviada a nuestro navegador y nos permite navegar por las páginas que requieren usuarios autenticados.

Este Ticket de autenticación es creado a partir de que lo se llama un machineKey (clave de máquina). Cuando nuestra aplicación arranca por primera vez en un servidor web, un machineKey es creado automáticamente. Al autenticarnos, este machineKey es utilizado para firmar digitalmente el Ticket de autenticación. Por otra parte, cuando navegamos a una página que requiere usuarios autenticados, el servidor utiliza el machineKey para desencriptar el Ticket de autenticación de la Cookie para validar el usuario. 

El problema surge cuando es un servidor diferente (por el balanceo de carga) el que atiende la petición de autenticación, e intenta desencriptar el Ticket de autenticación con un machineKey diferente. El resultado de esta acción causaría la invalidación del Ticket de autenticación original (y de la Cookie), y la redirección del usuario a la página de Login.

La solución

ASP.NET nos permite definir un machineKey personalizado para cada una de nuestras aplicaciones web. Esto implica que los servidores donde se ejecute la aplicación, no auto-generen uno propio y utilicen el que la aplicación les propone.

La configuración del machineKey se realiza dentro de la sección <system.web/> del archivo de configuración Web.config de la aplicación:

<machineKey validationKey="B2A3A7ED71A85AC9BCBBBAD8407F9642EEFA3B17FD2583CFD66A3BAF407900D2C45A85379FA2B4BE2397BECF14650306B6292C96418B772055F01E1EE751E434"
decryptionKey="E60EC68AB3752322D236E5727370620398818355316FB5FDFBF00EE4344AE7B7"
validation="SHA1" decryption="AES" /> 

Es recomendable generar un machineKey aleatorio (y diferente) para cada una de la aplicaciones que queramos publicar en nuestro Web hostingDesde este sitio web: ASP.Net MachineKey Generator podemos generar nuestros machineKey en función del Framework ASP.NET que estemos utilizando.

Jupyter Notebook sin instalar y gratis


Colaboratory, también llamado «Colab», permite ejecutar y programar en Python en un navegador con las siguientes ventajas:

  • No requiere configuración
  • Da acceso gratuito a GPUs
  • Permite compartir contenido fácilmente

Colab puede facilita pues  su trabajo, ya sea estudiante, científico de datos o investigador de IA pues como vemos es una palataforma «en la nube » que nos permite  implementar y probar código  sin tener que instalar nada  en nuestro equipo ademas con la certeza de que la plataforma siempres esta actualizada

Los cuadernos de Colab  permiten combinar código ejecutable y texto enriquecido en un mismo documento, además de imágenes, HTML, LaTeX y mucho más. Los cuadernos que creas en Colab se almacenan en su cuenta de Google Drive de modo qu e  puedes compartir sus cuadernos de Colab fácilmente con compañeros de trabajo o amigos, lo que les permite comentarlos o incluso editarlos (consulte más información en Información general sobre Colab).

Colab ademas es una herramienta muy utilizada en la comunidad de aprendizaje automático. Estos son algunos ejemplos de las aplicaciones que tiene Colab:

  •  Dar los primeros pasos con TensorFlow
  •  Desarrollar y entrenar redes neuronales
  •  Experimentar con TPUs
  •  Divulgar datos de investigación sobre IA
  •  Crear tutoriales

 

Primeros pasos

Para crear un cuaderno de Colab, puedes usar el menú Archivo que aparece arriba o bien acceder al enlace para crear un cuaderno de Colab.Los cuadernos de Colab son cuadernos de Jupyter alojados en Colab (puede obtener más información sobre el proyecto Jupyter en  jupyter.org).

 Un cuaderno es una lista de celdas que contienen texto explicativo o código ejecutable y su salida: simplemente tenemos que hacer clic en una celda para seleccionarla.

 Una vez que el botón de la barra de herramientas indique CONECTADO, haga clic en la celda para seleccionarla y ejecutar el contenido de las siguientes maneras:

  • Haga clic en el icono Reproducir en el margen izquierdo de la celda;
  • Escriba Cmd / Ctrl + Enter para ejecutar la celda en su lugar;
  • Escriba Shift + Enter para ejecutar la celda y mover el foco a la siguiente celda (agregando una si no existe ninguna);
  • Escriba Alt + Enter para ejecutar la celda e inserte una nueva celda de código inmediatamente debajo de ella.
  • Hay opciones adicionales para ejecutar algunas o todas las celdas en el menú Runtime.

En las celdas de texto puede hacer doble clic para editar esta celda. Las celdas de texto usan sintaxis  reducida . También puede agregar matemáticas a las celdas de texto usando LaTeX para ser renderizadas por MathJax. Simplemente coloque la declaración dentro de un par de signos $. Por ejemplo, $ \ sqrt {3x-1} + (1 + x) ^ 2 $ se convierte en 3x − 1 −−−−− √ + (1 + x) 2.

 

 Agregar y mover celdas

Puede agregar nuevas celdas usando los botones ** + CÓDIGO ** y ** + TEXTO ** que se muestran cuando se desplaza entre las celdas. Estos botones también se encuentran en la barra de herramientas sobre el cuaderno, donde se pueden usar para agregar una celda debajo de la celda seleccionada actualmente. Puede mover una celda seleccionándola y haciendo clic en ** Celda arriba ** o ** Celda abajo ** en la barra de herramientas superior. Las celdas consecutivas se pueden seleccionar mediante «selección de lazo» arrastrando desde fuera de una celda y a través del grupo. Las celdas no adyacentes se pueden seleccionar simultáneamente haciendo clic en una y luego manteniendo presionada la tecla Ctrl mientras hace clic en otra. De manera similar, usar Shift en lugar de Ctrl seleccionará todas las celdas intermedias.

Alias del sistema Jupyter incluye atajos para operaciones comunes, como ls:

Eso probablemente generó una gran salida. Puede seleccionar la celda y borrar la salida mediante las dos siguintes acciones:

  •  Haciendo clic en el botón borrar salida (x) en la barra de herramientas sobre la celda;
  • Haga clic con el botón derecho en el margen izquierdo del área de salida y seleccione «Borrar salida» en el menú contextual.

Ejecute cualquier otro proceso usando! con interpolación de cadenas de variables de Python, y tenga en cuenta que el resultado se puede asignar a una variable:

Colaboratory comparte la noción de magia de Jupyter. Hay anotaciones abreviadas que cambian la forma en que se ejecuta el texto de una celda. Para obtener más información, consulte la página de magia de Jupyter.

 

Finalizaciones automáticas y exploración de código

Colab proporciona finalizaciones automáticas para explorar atributos de objetos de Python, así como para ver rápidamente cadenas de documentación. Como ejemplo, primero ejecute la siguiente celda para importar el módulo numpy.

import numpy as np

Si ahora inserta el cursor después de np y presiona Punto (.), Verá la lista de finalizaciones disponibles dentro del módulo np. Las terminaciones se pueden abrir nuevamente usando Ctrl + Espacio.

np

Si escribe un paréntesis abierto después de cualquier función o clase en el módulo, verá una ventana emergente de su cadena de documentación:

np.ndarray

La documentación se puede abrir nuevamente usando Ctrl + Shift + Espacio o puede ver la documentación del método colocando el mouse sobre el nombre del método. Al pasar el cursor sobre el nombre del método, el enlace Abrir en pestaña abrirá la documentación en un panel persistente.

El enlace Ver fuente navegará hasta el código fuente del método.

Formato de excepción

Las excepciones están bien formateadas en las salidas de Colab:

Comentar  en una celda

Puede comentar en un cuaderno de Colaboratory como lo haría en un documento de Google. Los comentarios se adjuntan a las celdas y se muestran junto a la celda a la que hacen referencia.

Si tiene permisos de solo comentarios, verá un botón de comentario en la parte superior derecha de la celda cuando pase el cursor sobre él.

Si tiene permisos de edición o comentario, puede comentar en una celda de una de estas tres formas:

  • Seleccione una celda y haga clic en el botón de comentario en la barra de herramientas sobre la esquina superior derecha de la celda.
  • Haga clic con el botón derecho en una celda de texto y seleccione
  • Agregar un comentario en el menú contextual. Use el atajo Ctrl + Shift + M para agregar un comentario a la celda seleccionada actualmente.

Puede resolver y responder a los comentarios, y puede orientar los comentarios a colaboradores específicos escribiendo + [dirección de correo electrónico] (por ejemplo, [email protected]). Se enviará un correo electrónico a los colaboradores a los que se dirija. El botón Comentar en la esquina superior derecha de la página muestra todos los comentarios adjuntos al cuaderno.

 

Resultados ricos e interactivos

Hasta ahora, todos los resultados generados han sido texto, pero pueden ser más interesantes, como el cuadro a continuación.

 

Integración con Drive

Colaboratory está integrado con Google Drive. Le permite compartir, comentar y colaborar en el mismo documento con varias personas:

El botón COMPARTIR (arriba a la derecha de la barra de herramientas) le permite compartir la libreta y controlar los permisos establecidos en ella.

  • Archivo-> Hacer una copia crea una copia del cuaderno en Drive.
  • Archivo-> Guardar guarda el archivo en la unidad.
  • Archivo-> Guardar y el punto de control fija la versión para que no se elimine del historial de revisión.
  • Archivo-> Historial de revisiones muestra el historial de revisiones del portátil.

Algunos enlaces sobre  Colaboratory  para  mostrar la potencia  que tiene esta potente herramienta incluso corriendo en la red: 

 

Ciencia de datos

Con Colab, tambien puede aprovechar toda la potencia de las bibliotecas más populares de Python para analizar y visualizar datos. La celda de código de abajo utiliza NumPy para generar datos aleatorios y Matplotlib para visualizarlos. Para editar el código, solo tiene que hacer clic en la celda.

 

Puede importar tus propios datos a los cuadernos de Colab desde su cuenta de Google Drive, incluidas las hojas de cálculo, y también desde GitHub y muchas fuentes más.

Aqui algunos enlaces sobre uso de los datos:

 Aprendizaje automático

Con Colab, puedesimportar un conjunto de datos de imágenes, entrenar un clasificador de imágenes con dicho conjunto de datos y evaluar el modelo con tan solo usar unas pocas líneas de código. Los cuadernos de Colab ejecutan código en los servidores en la nube de Google, lo que te permite aprovechar la potencia del hardware de Google, incluidas las GPU y TPU, independientemente de la potencia de su equipo pues lo único que necesita es un navegador.

A continuación, se muestran algunos cuadernos del curso online de Google sobre aprendizaje automático. Para obtener más información, consulta el sitio web del curso completo.

 

Por cierto , toda esta informacion de este post podemos verla en ingles directamente en los propios notebook  gratuitos de Google  (observe que la mayoria de los enalces  suelen tener  extension  ipynb tipica de los noetbooks de Jupiter )