none
¿ Se puede compartir Session entre Aplicaciones ? RRS feed

  • Pregunta

  •  Buenas compañeros, en esta ocasión el caso es el siguiente

     Tengo distintas sitios en el mismo servidor IIS, el caso es que estas aplicaciones usan todas una misma base de datos por lo que logarse en cualquier aplicacion deberia asumir que estas logado en cualquier otra cuando esta quieras abrirla.

      Actualmente una de la aplicaciones hace Login y te muestra enlaces al resto de aplicaciones, estos enlaces se abren en una nueva pestaña ( no en una ventana nueva sino pestaña ).

      El caso es que en la aplicacion llamemos AppPrin te logas con usuario y password, esta aplicacion establece una variable de session Session["Logado"] = "Correcto", cuando pinchas en una aplicacion de la lista y esta se abre en una nueva ventana lo primero que mira es si esa variable Session["Logado"] == "Correcto", el caso es que por algun motivo esa variable es siempre null, es decir ha perdido su valor al abrir la nueva app desde el enlace.

    El enlace lanza el siguiente codigo, por si sirve de algo las aplicaciones aunque estan en el mismo server cada uno escucha en un puerto es decir que las urls son del tipo www.miservidor.es:puerto/principal.aspx ( donde lo unico que cambia es el puerto )

    public void OpenNewWindow(string url, string ventana)
            {
                ScriptManager.RegisterClientScriptBlock(this, GetType(), ventana, "customOpen('" + url + "');", true);
            }

     Espero haberme explicado correctamente.

     ¿ Igual no debo utilizar Session[""] o hay que configurarla de algun modo ?

    ¿ Que usuarias en vez de Session[""] ?

    Gracias por su ayuda

    lunes, 2 de abril de 2018 15:35

Respuestas

  •  Buenas Leandro,

    Tu respuesta me parece muy buena cuando quieres conocer dentro de una única aplicación si estas logado, pero como digo tengo 6 o 7 aplicaciones web distintas, todas ellas comparten base de datos de usuarios y entre ellas hay enlaces, lo que se pretende es que una vez logado en cualquiera de ellas, puedas acceder a las demás sin necesidad de volver a logarte sino que sirva el mismo que ya has hecho.

    ¿ Como puede ayudarme el que una aplicación asp.net controle la seguridad si tengo que pasarla al resto de aplicaciones ?

     Quizas no me explique bien pero la pregunta es ¿ Como paso el usuario y password de una a otra sin que lo tenga que hacer el usuario ? 

     Igual si implemento en todas las aplicaciones ese tipo de seguridad, entre una y otra tendré que enviarle esos datos sin pedirselos de nuevo al usuario ¿ Como ?  ademas queria evitar que en la url de la peticion fueran esos datos, deben de ir ocultos para que no se vean, por eso pense que la session me seria util

     En cualquier caso tu respuesta me es muy util pues intentare ir implementando la seguridad como explicas.

    Gracias

    martes, 3 de abril de 2018 8:39

Todas las respuestas

  • El objeto Session como tal no puede ser compartido.  Lo que necesita hacer es que los URL's de los sitios web pertenezcan todos a un mismo dominio.  Una vez hecho esto puede escribir un cookie de autenticación que podrá verse en todos los sitios web.  Esto es lo que normalmente se hace.

    Para que todos tengan el mismo URL, lo que debe hacer es publicar todos los sitios web "satelitales" como una subcarpeta del sitio web principal.  Cada subcarpeta se configura como aplicación aparte y listo.


    Jose R. MCP
    Code Samples

    lunes, 2 de abril de 2018 17:34
    Moderador
  • hola

    >>esta aplicacion establece una variable de session Session["Logado"] = "Correcto",

    horrible, pesima seguridad

    no puede usar NUNCA la session como medio de seguridad

    tienes que usar la seguridad de asp.net

    Login – Usando Password con Hash

    entonces defines en el web.config

    <authentication mode="Forms">
        <forms name="appNameAuth" path="/" loginUrl="frmLogin.aspx" defaultUrl="Default.aspx" protection="All" />
    </authentication>
       
      <authorization>
        <deny users="?" />
      </authorization>

    para autenticarte usando

    if (LoginService.Autenticar(txtUser.Text, txtPassword.Text))
        {
            FormsAuthentication.RedirectFromLoginPage(txtUser.Text, chkPersistLogin.Checked);
        }

    la idea es que uses

    Thread.CurrentPrincipal.Identity

    para conocer si estas autenticado o no, pero NO la session

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    martes, 3 de abril de 2018 6:43
  •  Buenas Leandro,

    Tu respuesta me parece muy buena cuando quieres conocer dentro de una única aplicación si estas logado, pero como digo tengo 6 o 7 aplicaciones web distintas, todas ellas comparten base de datos de usuarios y entre ellas hay enlaces, lo que se pretende es que una vez logado en cualquiera de ellas, puedas acceder a las demás sin necesidad de volver a logarte sino que sirva el mismo que ya has hecho.

    ¿ Como puede ayudarme el que una aplicación asp.net controle la seguridad si tengo que pasarla al resto de aplicaciones ?

     Quizas no me explique bien pero la pregunta es ¿ Como paso el usuario y password de una a otra sin que lo tenga que hacer el usuario ? 

     Igual si implemento en todas las aplicaciones ese tipo de seguridad, entre una y otra tendré que enviarle esos datos sin pedirselos de nuevo al usuario ¿ Como ?  ademas queria evitar que en la url de la peticion fueran esos datos, deben de ir ocultos para que no se vean, por eso pense que la session me seria util

     En cualquier caso tu respuesta me es muy util pues intentare ir implementando la seguridad como explicas.

    Gracias

    martes, 3 de abril de 2018 8:39