2009-11-16 10 views
5

Necesito iniciar sesión en un sitio web y realizar una acción. La página web se basa RESTO así que fácilmente puedo ingresar al hacer esto (la información de acceso se incluye como una cadena de consulta en la URL, por lo que dont't necesario configurar las credenciales):C# mantener la sesión a través de HTTPS en el cliente

CookieContainer cookieJar = new CookieContainer(); 

HttpWebRequest firstRequest = (HttpWebRequest) WebRequest.Create(loginUrl); 
firstRequest.CookieContainer = cookieJar; 
firstRequest.KeepAlive = true; 
firstRequest.Method = "POST"; 
HttpWebResponse firstResponse = (HttpWebResponse)firstRequest.GetResponse(); 

que funciona y me registra pulg. Recibo una cookie para mantener la sesión y se almacena en la cookieJar que se muestra arriba. Luego hago una segunda solicitud como esta:

HttpWebRequest secondRequest = (HttpWebRequest) WebRequest.Create(actionUrl); 
secondRequest.Method = "POST"; 
secondRequest.KeepAlive = true; 
secondRequest.CookieContainer = cookieJar; 
WebResponse secondResponse = secondRequest.GetResponse(); 

Y me aseguro de asignar las cookies a la nueva solicitud. Pero por alguna razón, esto no parece funcionar. Recibo un mensaje de error que me dice "mi sesión ha expirado o ha expirado", y esto se hace uno tras otro, por lo que no es un problema de tiempo.

He usado Fiddler para examinar los encabezados HTTP, pero me resulta difícil porque es HTTPS. (Sé que puedo descifrarlo pero no parece funcionar bien.)

Puedo tomar mis URL para este servicio de descanso y pegarlas en Firefox y todo funciona bien, por lo que debe ser algo que estoy haciendo mal y no el otro extremo de la conexión.

No estoy muy familiarizado con HTTPS. ¿Debo hacer algo más para mantener mi sesión? Pensé que la cookie sería, pero tal vez hay algo más que debo mantener en las dos solicitudes.

Éstos son los encabezados devueltos cuando envío de la primera solicitud (excepto He cambiado la cookie para proteger a los inocentes!):

X-DB-Content-length=19 
Keep-Alive=timeout=15, max=50 
Connection=Keep-Alive 
Transfer-Encoding=chunked 
Content-Type=text/html; charset=WINDOWS-1252 
Date=Mon, 16 Nov 2009 15:26:34 GMT 
Set-Cookie:MyCookie stuff goes here 
Server=Oracle-Application-Server-10g 

Cualquier ayuda se agradece, me estoy quedando sin ideas.

Respuesta

4

por fin tengo trabajo después de descifrar el tráfico HTTP de mi programa.

La cookie que estoy recibiendo no muestra la variable Path. Entonces, .NET toma la ruta actual y la asigna como la ruta en la cookie, incluida la página actual. es decir: si fuera http://mysite/somepath/somepage.htm, establecería la ruta de la cookie =/somepath/somepage.htm. Este es un error, ya que debe asignarse a "/", que es lo que hacen todos los navegadores web. (Espero que arreglen esto.)

Después de notar esto agarré la cookie y modifiqué la propiedad de ruta y todo funciona bien ahora.

Cualquier persona que tenga un problema como este echa un vistazo a Fiddler. .NET usa el almacén de certificados de Windows, por lo que para descifrar el tráfico http de su programa deberá seguir las instrucciones aquí: http://www.fiddler2.com/Fiddler/help/httpsdecryption.asp. También deberá activar el descifrado en la pestaña Opciones \ HTTPS de Fiddler.

+0

Microsoft parece haber solucionado esto en .NET 4. – Kelly

+0

Hola Kelly, también estoy enfrentando una sesión expirada que podría ser similar a su caso anterior, ¿podría echar un vistazo a este enlace: http://stackoverflow.com/ preguntas/22957840/crawling-session-expired Gracias – bluewonder

0

De MSDN:

Cuando un usuario se mueve hacia atrás y hacia adelante entre las áreas seguras y públicas, la cookie de sesión generado por ASP.NET (o URL si ha habilitado el estado de sesión sin cookies) se mueve con ellos en texto plano, pero la cookie de autenticación nunca se pasa por las conexiones HTTP no cifradas , siempre que la propiedad Secure cookie esté configurada.

Básicamente, la cookie se puede pasar por HTTP y HTTPS si la propiedad 'Secure' está configurada en 'false'.

ver también how can I share an asp.net session between http and https

+0

No estoy seguro de que lo entiendo. Estoy en el cliente, no en el lado del servidor de esta solicitud. Necesito mantener la sesión entre dos o más llamadas al servidor, pero a pesar de que traigo la cookie no parece reconocer que estoy usando la misma sesión. – Kelly

+0

Estaba un poco confundido suponiendo que el sitio con el que está hablando estaba basado en ASP.Net, pero independientemente de su sugerencia fue establecer la cookie que obtiene después de la propiedad segura de la primera llamada en verdadero y ver si eso funciona (creo) – John

+0

Le di una oportunidad. Las cookies volvieron como seguras = falsas. Los configuré para la segunda solicitud, pero todavía no tuve suerte. – Kelly

Cuestiones relacionadas