2010-07-16 11 views
7

tengo el siguiente código para acceder a una aplicación de sitio externo (aplicación asp.net) de un formulario del sitio de inicio de sesión local (escrito en PHP):php rizo - valor publicación asp.net estado de vista

<?php 
$curl_connection = curl_init('www.external.com/login.aspx'); 

curl_setopt($curl_connection, CURLOPT_CONNECTTIMEOUT, 30); 
curl_setopt($curl_connection, CURLOPT_USERAGENT, 
"Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)"); 
curl_setopt($curl_connection, CURLOPT_RETURNTRANSFER, true); 
curl_setopt($curl_connection, CURLOPT_SSL_VERIFYPEER, false); 
curl_setopt($curl_connection, CURLOPT_FOLLOWLOCATION, 1); 

// Post data array 
$post_data['LoginControl$UserName'] = 'ExampleUName'; 
$post_data['LoginControl$Password'] = 'ExamplePWord'; 

// Add form fields into an array to get ready to post 
foreach ($post_data as $key => $value) 
    { 
$post_items[] = $key . '=' . $value; 
    } 
$post_string = implode ('&', $post_items); 

// Tell cURL which string to post 
curl_setopt($curl_connection, CURLOPT_POSTFIELDS, $post_string); 

// Execute and post 
$result = curl_exec($curl_connection); 
?> 

I ser dirigido al formulario de inicio de sesión del sitio externo en lugar de dirigirse a la aplicación que inició sesión. Creo que el problema es que necesito pasar los valores de viewstate, ¿pero no estoy seguro de cómo hacerlo?

No tengo control sobre la aplicación externa. Pero queremos que los usuarios puedan iniciar sesión en la aplicación a través de nuestro sitio web, para mantener la marca, etc.

He publicado un par de temas más recientemente sobre el uso de php cURL, pero ahora estoy en el escenario donde creo que viewstate es el problema ...

Gracias, Mark.

Respuesta

2

Cambio:

curl_setopt($curl_connection, CURLOPT_FOLLOWLOCATION, 1); 

Para:

curl_setopt($curl_connection, CURLOPT_FOLLOWLOCATION, false); 

También es necesario configurar un archivo de cookies, echar un vistazo a CURLOPT_COOKIEFILE

CURLOPT_COOKIEFILE:

El nombre de el archivo que contiene los datos de la cookie. El archivo de cookies puede estar en formato Netscape, o simplemente encabezados de estilo HTTP descargados en un archivo.

CURLOPT_COOKIE:

El contenido de la "Cookie:" encabezado que se utiliza en la petición HTTP. Tenga en cuenta que varias cookies están separados por un punto y coma seguido de un espacio (por ejemplo, "fruto = manzana; color = red")

CURLOPT_COOKIEJAR:

que el nombre de un archivo para guardar todas las cookies internas cuando la conexión cierra

@see http://www.php.net/manual/en/function.curl-setopt.php

curl_setopt($curl_connection, CURLOPT_COOKIEFILE, 'cookiefile.txt'); 
curl_setopt($curl_connection, CURLOPT_COOKIEJAR, 'cookiefile.txt'); 
+0

Gracias - Añadido los de, pero todavía sólo ha dirigido al formulario de inicio de sesión en el sitio externo .. –

4

Esto parece ser un verdadero problema cuando se trata de raspar las páginas ASP.NET.

Las páginas contienen un campo oculto llamado "__VIEWSTATE" que contiene un conjunto codificado de base64 de variables que contienen parte o todo el estado de la página cuando se envió la página. Por lo general, también contiene el SHA1 de viewstate.

Lo que esto significa es que su publicación debe contener todo en _VIEWSTATE o fallará.

He podido publicar una página de inicio de sesión simple que tiene solo 2 campos pero no una página más compleja en la que el autor ha elegido poner todo el estado de la página en viewstate.

Hasta ahora no he podido encontrar una solución.

+0

Gracias por la respuesta Ed. También llegué a la conclusión de que se debía a los valores de VIEWSTATE. –

Cuestiones relacionadas