¿Puedo abandonar una sesión InProc ASP.NET de una sesión diferente a la que realiza la solicitud?

StackOverflow https://stackoverflow.com/questions/257843

Pregunta

Tenemos una aplicación que inicia sesión con un servidor de autenticación centralizado (CAS). Nos gustaría hacer un cierre de sesión único, de modo que si el usuario cierra sesión en una aplicación (por ejemplo, un portal front-end), el usuario cierra automáticamente la sesión de todas las aplicaciones utilizando el mismo ticket de inicio de sesión único.

Se espera que cada aplicación registre un enlace de cierre de sesión (URL) con el CAS al momento de iniciar sesión en esa aplicación. Cuando el CAS recibe la solicitud de cierre de sesión de una de las aplicaciones, invoca el enlace de cierre de sesión para todas las aplicaciones que comparten el ticket SSO.

Mi pregunta es esta: ¿hay alguna forma de abandonar una sesión InProc de una sesión diferente? Supongo que, dado que la solicitud HTTP vendrá del servidor CAS, obtendrá su propia sesión, pero es la sesión del usuario la que quiero finalizar. Tengo una muy buena idea de cómo hacerlo usando un servidor de estado de sesión separado, pero me gustaría saber si es posible usar el estado de sesión InProc.

¿Fue útil?

Solución 2

Después de investigar un poco y considerar las respuestas proporcionadas hasta ahora, he encontrado una alternativa que me permite continuar usando la sesión InProc. Básicamente, consiste en extender el HttpModule que ya maneja el inicio de sesión único a las salidas de CAS detectadas y redirigir el navegador a la página de cierre de sesión de la aplicación.

Esquema:

Inicio de sesión:

  1. Para cada nueva solicitud de inicio de sesión único, cree una nueva cookie de SSO y codifique un valor único en ella para identificar la sesión (no la identificación de la sesión, para que no se filtre).
  2. Construya la URL de devolución de llamada de cierre de sesión, codificada con el identificador, y regístrela con el servidor CAS.

Cerrar sesión:

  1. Cuando se recibe una solicitud de cierre de sesión del servidor CAS, decodifique el identificador y guárdelo en un caché de toda la aplicación. Esto debe fijarse en el caché al menos el tiempo suficiente para que la sesión caduque de forma natural.
  2. Para cada solicitud, busque la cookie SSO y compruebe su valor con los identificadores de sesión en caché y desconectados. Si hay un golpe, elimine la cookie SSO y redirija el navegador a la URL de cierre de sesión de la aplicación.
  3. Para cada cierre de sesión, verifique si hay una cookie SSO, de ser así, envíe la solicitud de cierre de sesión al CAS. En cualquier caso, abandone la sesión del usuario y cierre la sesión de la aplicación.

Page_Load:

  1. Verifique la presencia de la cookie SSO. Si no hay una, redirija a la página de cierre de sesión.

Otros consejos

Jaja, bueno ... Parece que puedes. Me preguntaba si había alguna forma de hacer esto, resulta que sí.

Cuando usa InProc, InProcSessionStateStore (clase interna) conserva el estado de la sesión en un caché interno (no público). Puede acceder a este caché a través de la reflexión y eliminar el estado de la sesión manualmente.

using System;
using System.Reflection;
using System.Web;

object obj = typeof(HttpRuntime).GetProperty("CacheInternal", 
    BindingFlags.NonPublic | BindingFlags.Static)
        .GetValue(null, null);

if (obj != null)
{
    MethodInfo remove = obj.GetType()
        .GetMethod("Remove", BindingFlags.NonPublic | BindingFlags.Instance, 
            Type.DefaultBinder, new Type[] { typeof(string) }, null);

    object proc = remove.Invoke(obj, new object[] { "j" + state.SessionID });
}

El resultado final es que la siguiente solicitud tomará el mismo SessionID, pero el HttpSessionState estará vacío. Todavía obtendrá los eventos Session_Start y Session_End.

Con InProc SessionState, no podrá acceder a los datos ... Con StateServer, todavía tendrá un escenario difícil tratando de acceder a la API correcta para eliminar la sesión.

Lo más probable es que desee utilizar una solución de estado respaldada por base de datos como el proveedor de estado SqlServer preenvasado o una solución de terceros como DOTSS: http://codeplex.com/dotss

Con la solución respaldada por la base de datos, podrá buscar el registro de estado en una tabla por ID de sesión y marcarlo como completado. Estas técnicas variarán según el proveedor que elija.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top