2008-09-11 11 views
11

Esta pregunta está relacionada con this one, aunque creo que estuve un poco extenuado para obtener una buena respuesta. Voy a mantener esto breve.ASP.Net: Si tengo la ID de sesión, ¿puedo obtener el objeto de sesión?

Estoy trabajando en un controlador web (ashx) que acepta una publicación de formulario desde una página aspx. Cuando el controlador recibe esta publicación del formulario, para hacer lo que necesita hacer, necesita conocer al usuario que inició sesión (User.Identity.Name), pero no puedo confiar en las cookies que envía el navegador.

Sé que puedo conseguir el Session.SessionID y colocarlo en un campo de formulario oculto, pero una vez que mi controlador recibe el formulario de envío, ¿cómo puedo usar esa SessionID de averiguar la identidad del usuario que ha iniciado sesión en?

Estoy usando el modo StateServer para el estado de la sesión.

Respuesta

3

creo que puede hacerlo implementará la interfaz IReadOnlySessionState en su HttpHandler

+0

Un consejo excelente, pero esto todavía se basa en el envío de la cookie ASP.NET_SessionId, que no puedo confiar en navegador. Necesito una forma de pasar manualmente el SessionId al manejador. –

0

En una implementación HttpHandler o HttpModule, no siempre se puede tener acceso a la sesión del evento BeginRequest. Hay otro evento que puede manejar, llamado OnAcquireRequestState. Si escribe su código en ese evento, entonces HttpContext.Current.Session no será nulo.

1

A menos que sea necesario utilizar la sesión directamente, siempre puede almacenar la información sobre la identidad del usuario conectado en un diccionario singleton o caché y hacer referencia a ella a través del ID de sesión almacenado en un campo oculto. Personalmente, veo problemas de seguridad en esto, pero no entraré en eso. Consideraría emitir identidades de uso único para este tipo de implementación.

+1

Buena idea, pero ¿dónde almacenar este diccionario singleton? El objeto Aplicación no se distribuirá a otros servidores web en la granja de servidores (ni tampoco a otros hilos de proceso en un jardín web), la base de datos sql es una opción, pero esperaba algo más elegante. –

+0

Servidor SQL sería su mejor opción. Si ya está utilizando el servidor de estado para esto, sería una penalización similar. O podría escribir su propio servicio WCF que manejaría este intercambio. Podría funcionar como el único agente de identificación así como para el almacenamiento de identidad. O incluso use un servicio de punto final SQL. –

Cuestiones relacionadas