none
Como autenticar una aplicación para múltiples dominios RRS feed

  • Pregunta

  • Hola

    Tengo 1 aplicación la cual sirve para dos dominios de países:

    .com.mx
    .com.ar

    Tengo una única aplicación hospedada en el server y basada en el dominio se determina el país. El 90% de las funcionalidades de la aplicación son manejadas para cada país (se especifica el dominio), pero tengo un controlador en particular (Global) el cual debe operar bajo el dominio .com.

    Al entrar a cualquier página, las urls hacia ese controlador son url absolutas, es decir, se muestran http://dominio.com/global, por lo cual el usuario va a estar navegando entre dominios diferentes, sin embargo para el debe ser transparente.

    Esto me está dando muchisimos problemas al momento del Login, ya que si me autentico en .com.mx, debo autenticar al menos para .com (si pudiera para el resto de los países sería ideal). Pero como las cookies y todo lo generado es único para cada dominio ya que asi lo maneja el navegador no se como hacerlo.

    Hasta ahorita lo que tengo es unca lógica que al memento de hacer login (Desde un país) hago un redirect al .com para que se generen las cookies en ambos lados pero no funciona muy bien.

    Como puedo solucionar esto? Cabe destacar que las funciones del controlador Global (las .com), son realmente secundarias dentro del sitio web.

    Tengo Visual Studio 2017.

    Saludos

    martes, 13 de marzo de 2018 12:54

Todas las respuestas

  • Cuando habla de "dominios", ¿son dominios de Active Directory o son los nombres del sitio web solamente?  ¿Qué tipo de autenticación utiliza usted en su(s) proyecto(s)?  ¿Cuántos proyectos son?

    Jose R. MCP
    Code Samples

    martes, 13 de marzo de 2018 14:19
  • Básicamente estás buscando un sistema de "Single Sign On". Podrías usar alguno de los que ya existen (por ejemplo, apoyarte en los servicios de federación de Azure, o implementar tu propio ADFS). O si quieres implementarlo tú mismo, el principio es este:

    Para compartir la autenticación entre los sitios A y B, se crea otro sitio C. Cundo el usuario entra en A y no está autenticado, que normalmente rebotaría a la página de Login de A, en realidad no se muestra dicha página sino que rebota a C. C pide las credenciales, genera una cookie para C, y rebota de nuevo a A pasándole un código que indica "sí, reconozco a este usuario". El sitio A entonces genera una cookie de autenticación para el usuario, que le mantiene "logado" mientras navega por A. Si a continuación pasa a B, como B no reconoce la cookie, rebota a su página de autenticación, la cual (igual que A) rebota a C. Esta vez, C reconoce que el usuario ya está logado (gracias a la cookie de C) y sin presentar nada en pantalla rebota a B pasándole el código correcpondiente para que B cree su propia cookie, que mantiene al usuario logado mientras navega por B.

    martes, 13 de marzo de 2018 15:06
  • Básicamente estás buscando un sistema de "Single Sign On". Podrías usar alguno de los que ya existen (por ejemplo, apoyarte en los servicios de federación de Azure, o implementar tu propio ADFS). O si quieres implementarlo tú mismo, el principio es este:

    Para compartir la autenticación entre los sitios A y B, se crea otro sitio C. Cundo el usuario entra en A y no está autenticado, que normalmente rebotaría a la página de Login de A, en realidad no se muestra dicha página sino que rebota a C. C pide las credenciales, genera una cookie para C, y rebota de nuevo a A pasándole un código que indica "sí, reconozco a este usuario". El sitio A entonces genera una cookie de autenticación para el usuario, que le mantiene "logado" mientras navega por A. Si a continuación pasa a B, como B no reconoce la cookie, rebota a su página de autenticación, la cual (igual que A) rebota a C. Esta vez, C reconoce que el usuario ya está logado (gracias a la cookie de C) y sin presentar nada en pantalla rebota a B pasándole el código correcpondiente para que B cree su propia cookie, que mantiene al usuario logado mientras navega por B.

    Hola, entiendo lo que propones, pero hay varios casos que no veo que se cubran con esta solución:

    - Como sería el Logout. Si el usuario hace Logout desde el sitio B o A, como le borro las cookies y/o session en el otro sitio.
    - Entiendo que si me autentico A y luego intento entrar a B, lo rebota a C y al encontrarse las cookies en C, este lo rebota a B para que genere las sessiones. Pero que pasa si entra a una página web donde no existe "este rebote", es decir, una vista donde el usuario pueda ver el contenido de la página sin estar autenticado, pero tengo que mostrarle en el header la información de su session? 

    Saludos
    martes, 13 de marzo de 2018 18:44
  • Como sería el Logout.

    Una opción es ponerle al login un tiempo de vida relativamente breve, de forma que cada vez que expira tiene que pasar por C para renovar la cookie. Esto no necesariamente requiere un redirect a través del navegador, puede hacerse que el token recibido desde C contenga una expiración, y que sea la rutina que valida el acceso a cada página la que compruebe si ha expirado y en ese caso le pida la renovación a C, sin que se note nada en el navegador. Obviamente, es C el que toma nota de cuando se ha hecho el Logout. Si el logout se hace en A o B, éstos transmiten la orden correspondiente a C, al igual que se comunican con C al hacer login.

    La otra opción, puesto que todos los dominios están bajo tu control, es que cuando el usuario haga logout en uno se transmita un mensaje a todos los demás para avisarles de que invaliden el token de ese usuario. Esto puede centralizarse en C -- cuando se hace logout en un dominio, éste lo transmite a C y como C sabe todos los logins que ha ido autorizando para ese usuario, puede enviar el correspondiente comando de desconexión a todos esos dominios.

    Pero que pasa si entra a una página web donde no existe "este rebote", es decir, una vista donde el usuario pueda ver el contenido de la página sin estar autenticado
    Pregunto: ¿Cómo tratas esa situación si no tienes varios dominios, es decir si tienes una autenticación clásica, en un único dominio?¿Qué ocurre si hay páginas "abiertas" que no requieren autenticación y el usuario entra directamente a una de ellas? Obviamente no puedes mostrar ningún dato del usuario en la cabecera si no tienes datos del usuario. Piensa en cómo tratarías esa situación en un servidor convencional, y casi seguro que el mismo tratamiento es igualmente aplicable al caso de los múltiples dominios.
    martes, 13 de marzo de 2018 19:16