2009-09-14 18 views
11

Tengo un sitio web que usa autenticación y membresía de formularios. Un usuario debe tener las cookies habilitadas para usar el sitio. Se me ha pedido que cambie el código para que la identificación de la sesión se modifique tan pronto como un usuario inicie sesión. Aparentemente esto protegerá contra un ataque de fijación de sesión (http://en.wikipedia.org/wiki/Session_fixation). ¿Alguien sabe cómo puedo cambiar la identificación de la sesión sin perder toda la sesión? PHP tiene un método específico para hacer esto, pero no puedo encontrar un equivalente .NET.cómo cambiar la identificación de la sesión después de iniciar sesión en asp.net

Respuesta

5

Here's a blog post que habla de esto:

ASP.NET no admite directamente funcionalidad para regenerar una sesión ID. Consulte la documentación relativa al , el número here. Hay un not-so quick and dirty way para hacerlo por estableciendo el valor ASPNET_SessionID en la cadena vacía y redirigiendo así que el valor se regenera.

+1

i aslo pensar en esto, pero después de regenerado de eso, todo el objeto en objeto de sesión perderán ... El – MemoryLeak

+1

La publicación de blog a la que vincula ya no está disponible. –

6

He respondido una pregunta similar al Generating a new ASP.NET session in the current HTTPContext. Básicamente, debemos cambiar parte del estado interno de SessionStateModule para poder regenerar el ID de sesión sin perder objetos en la sesión. Usé la reflexión para establecer el campo _rqId en la nueva ID y _rqSessionStateNotFound en verdadero. La desventaja es que debemos otorgar "plena confianza" a la aplicación.

+2

La [respuesta aceptada] (http://stackoverflow.com/a/1419508/295686) hace referencia a un artículo dirigido a .NET 1.1 (y en realidad no aborda la fijación de sesión, solo la reutilización de ID de sesión anterior), pero esto la solución era más elegante y funcionaba en nuestra aplicación .NET 4.5 (un sitio MVC y un sitio Web Forms). – mlhDev

1

Ésta es una pregunta muy viejo que estoy resucitar, pero aquí está la solución:

var manager = new SessionIDManager(); 
bool redirected, isAdded; 
manager.SaveSessionID(System.Web.HttpContext.Current, 
    "5vonjb4mtb1of2fxvhjvkh5d", out redirected, out isAdded); 

// sessionId now equals "5vonjb4mtb1of2fxvhjvkh5d" 
var sessionId = Session.SessionID; 
+0

Lo sé, ha pasado un tiempo. Pero probamos su código y no está funcionando para nosotros. sessionId no es igual a "5vonjb4mtb1of2fxvhjvkh5d". – mosquito87

+0

hice esto con éxito. sessionid cambia al nuevo sessionid. – pinopino

+2

Esto nos acercó más, pero no lo suficientemente cerca, sigue trabajando en ello. Esto actualiza la ID de la sesión y envía la actualización de la cookie tal como se esperaba, pero aún nos gustaría utilizar la sesión durante la misma solicitud. No podemos hacer eso ahora mismo: parece que el maletín de sesión es el anterior; la próxima solicitud ve la nueva bolsa de sesión, pero nuestros valores no están allí. – mlhDev

Cuestiones relacionadas