none
Pregunta sobre aplicaciones web asp.net c# RRS feed

  • Pregunta

  • Saludos amigos

    muchachos en una aplicación web, no es una pagina web, es un sistema de divisas (Cambio y Ventas de dolares y Euros).

    mi pregunta es:

    la aplicación esta montada en un servidor (IIS) y se puede accesar desde varias pc en la red via web, tengo 3 pc enlazadas, PC-01, PC-02 y PC-03.

    por ejemplo: Si un usuario se loguea al sistema en la pc-01 esta bien que pueda loguiarse el mismo usuario en la pc-02 sin cerrar su usuario en la aplicacion web.

    lo pregunto porque lleva un modulo de caja registradora para el dinero y no se si a nivel web eso es ta bien o debo hacer que el usuario no se pueda loguiar si su usuario esta en uso.

    amigos no se trata de código ni nada solo es una respuesta como debo hacerlo.

    gracias

    martes, 5 de septiembre de 2017 10:23

Respuestas

  • hola

    lo que plantes depende un poco del negocio

    pero en un entorno web es algo complicado mantener un tracking de los usuarios que estan autenticado, mas que nada porque no deberia haber estado del lado del servidor, o deberias tener el minimo posible

    una alternativa si quieres limitarlo es registrar al usuario que se autentica en el objeto Application, de esta forma esa info sera global al siti o web pudiendo validar si ya se encuentra en esa lista, si lo esta por supuesto no permiten un segundo login

    el tema es detectar cuando cierra session, existen eventos en el Global.asax, pero no son del todo sincronos o fiables, siempre esta la posibilidad de un restart del sitio para eliminar los datos del objetos application o algun modulo que desarrollos para estos casos

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    • Propuesto como respuesta Willams Morales martes, 5 de septiembre de 2017 17:34
    • Marcado como respuesta agustin173 martes, 5 de septiembre de 2017 21:03
    martes, 5 de septiembre de 2017 16:44
  • Se recurre a chapucillas como la que te he dicho de controlarlo por tiempo (se resetea un Timer cada vez que hacen una navegación y si el Timer lleva x tiempo sin resetearse asumimos que el usuario ya no está conectado y le permitimos hacer login desde otro sitio). Otra opción es examinar algún dato tal como la IP de la conexión y/o el tipo de navegador. Pero nada de esto es una solución "perfecta", por ejemplo, con la del temporizador tienes el problema de que si al usuario se le cierra accidentalmente el navegador y quiere volver a abrirlo, no se le permite reconectarse hasta que ha pasado un cierto tiempo, lo cual crea molestias para los usuarios legítimos. Y con lo de la IP, tienes el mismo problema si se cierra la conexión y tiene que abrir otra nueva, o si dos usuarios legítimos quieren conectarse a la vez desde detrás de un NAT que les asigna la misma IP pública.

    Con aplicaciones Winforms no existen estos problemas, porque el código ejecutable y la interfaz de usuario están en el mismo programa, y por lo tanto el ejecutable sí que sabe en todo momento si el programa está abierto o no.

    • Propuesto como respuesta Willams Morales martes, 5 de septiembre de 2017 17:34
    • Marcado como respuesta agustin173 martes, 5 de septiembre de 2017 21:03
    martes, 5 de septiembre de 2017 16:54
  • [...] que el usuario no se pueda loguiar si su usuario esta en uso.

    Aquí habría que matizar algo, y es que el concepto de "el usuario está en uso" no es aplicable en web igual que en una aplicación de escritorio.

    En una aplicación web, el usuario solo está en uso durante una fracción de segundo, cuando hace click en algún botón de la pantalla que ocasiona que se envíe al servidor una petición, que se ejecuta rapidísimo y devuelve una respuesta HTML a la pantalla. En ese momento, la conexión se desconecta. Aunque el usuario mantenga abierto el navegador y siga viendo la pantalla, eso es completamente desconocido para el servidor, que no sabe si el navegador sigue abierto o no. Desde su punto de vista, el usuario no está en uso.

    Si ese usuario hace algo en otra pantalla, vuelve a ser una conexión de una fracción de segundo desde el punto de vista del servidor (que no sabe que la otra pantalla sigue abierta).

    Puedes recurrir a algún truco como por ejemplo cronometrar cuánto tiempo ha transcurrido desde la última petición y no dejar acceder desde otra IP hasta que no haya transcurrido cierto tiempo mínimo, pero no es un sistema infalible para saber si está o no está viendo el programa en dos pantallas.

    • Propuesto como respuesta Willams Morales martes, 5 de septiembre de 2017 17:34
    • Marcado como respuesta agustin173 martes, 5 de septiembre de 2017 21:03
    martes, 5 de septiembre de 2017 12:54

Todas las respuestas

  • [...] que el usuario no se pueda loguiar si su usuario esta en uso.

    Aquí habría que matizar algo, y es que el concepto de "el usuario está en uso" no es aplicable en web igual que en una aplicación de escritorio.

    En una aplicación web, el usuario solo está en uso durante una fracción de segundo, cuando hace click en algún botón de la pantalla que ocasiona que se envíe al servidor una petición, que se ejecuta rapidísimo y devuelve una respuesta HTML a la pantalla. En ese momento, la conexión se desconecta. Aunque el usuario mantenga abierto el navegador y siga viendo la pantalla, eso es completamente desconocido para el servidor, que no sabe si el navegador sigue abierto o no. Desde su punto de vista, el usuario no está en uso.

    Si ese usuario hace algo en otra pantalla, vuelve a ser una conexión de una fracción de segundo desde el punto de vista del servidor (que no sabe que la otra pantalla sigue abierta).

    Puedes recurrir a algún truco como por ejemplo cronometrar cuánto tiempo ha transcurrido desde la última petición y no dejar acceder desde otra IP hasta que no haya transcurrido cierto tiempo mínimo, pero no es un sistema infalible para saber si está o no está viendo el programa en dos pantallas.

    • Propuesto como respuesta Willams Morales martes, 5 de septiembre de 2017 17:34
    • Marcado como respuesta agustin173 martes, 5 de septiembre de 2017 21:03
    martes, 5 de septiembre de 2017 12:54
  • Entonces alberto como hacen los programadores para evitar eso o no hay forma alguna.

    o ese tipo de programas que llevan usuarios que no me permitan loguearse dos veces en un mismo sistema no se pueden hacer en lenguajes de programación WEB. y abria de usar un lenguaje Winforms. (Windows) por ejemplo.

    porque a nivel de winforms yo se que se puede hacer.

    martes, 5 de septiembre de 2017 13:54
  • hola

    lo que plantes depende un poco del negocio

    pero en un entorno web es algo complicado mantener un tracking de los usuarios que estan autenticado, mas que nada porque no deberia haber estado del lado del servidor, o deberias tener el minimo posible

    una alternativa si quieres limitarlo es registrar al usuario que se autentica en el objeto Application, de esta forma esa info sera global al siti o web pudiendo validar si ya se encuentra en esa lista, si lo esta por supuesto no permiten un segundo login

    el tema es detectar cuando cierra session, existen eventos en el Global.asax, pero no son del todo sincronos o fiables, siempre esta la posibilidad de un restart del sitio para eliminar los datos del objetos application o algun modulo que desarrollos para estos casos

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    • Propuesto como respuesta Willams Morales martes, 5 de septiembre de 2017 17:34
    • Marcado como respuesta agustin173 martes, 5 de septiembre de 2017 21:03
    martes, 5 de septiembre de 2017 16:44
  • Se recurre a chapucillas como la que te he dicho de controlarlo por tiempo (se resetea un Timer cada vez que hacen una navegación y si el Timer lleva x tiempo sin resetearse asumimos que el usuario ya no está conectado y le permitimos hacer login desde otro sitio). Otra opción es examinar algún dato tal como la IP de la conexión y/o el tipo de navegador. Pero nada de esto es una solución "perfecta", por ejemplo, con la del temporizador tienes el problema de que si al usuario se le cierra accidentalmente el navegador y quiere volver a abrirlo, no se le permite reconectarse hasta que ha pasado un cierto tiempo, lo cual crea molestias para los usuarios legítimos. Y con lo de la IP, tienes el mismo problema si se cierra la conexión y tiene que abrir otra nueva, o si dos usuarios legítimos quieren conectarse a la vez desde detrás de un NAT que les asigna la misma IP pública.

    Con aplicaciones Winforms no existen estos problemas, porque el código ejecutable y la interfaz de usuario están en el mismo programa, y por lo tanto el ejecutable sí que sabe en todo momento si el programa está abierto o no.

    • Propuesto como respuesta Willams Morales martes, 5 de septiembre de 2017 17:34
    • Marcado como respuesta agustin173 martes, 5 de septiembre de 2017 21:03
    martes, 5 de septiembre de 2017 16:54
  • Gracias a todos por sus respuestas

    Gracias

    miércoles, 6 de septiembre de 2017 20:59