2010-07-16 2 views
7

Ho il seguente codice per l'accesso in un'applicazione sito esterno (asp.net app) da un modulo di login sito locale (scritto in PHP):php curl - valore distacco asp.net viewstate

<?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 viene indirizzato al modulo di accesso del sito esterno anziché essere indirizzato all'applicazione registrata. Penso che il problema sia che devo passare i valori del viewstate, ma non sono sicuro di come farlo?

Non ho il controllo dell'applicazione esterna. Ma vogliamo che gli utenti siano in grado di accedere all'applicazione tramite il nostro sito Web, mantenere il branding ecc.

Recentemente ho pubblicato un paio di altri thread sull'uso di php cURL, ma ora sono sul palco dove penso che il problema sia lo stato di visualizzazione ...

Grazie, Mark.

risposta

2

Cambio:

curl_setopt($curl_connection, CURLOPT_FOLLOWLOCATION, 1); 

A:

curl_setopt($curl_connection, CURLOPT_FOLLOWLOCATION, false); 

È inoltre necessario impostare un file cookie, dare un'occhiata a CURLOPT_COOKIEFILE

CURLOPT_COOKIEFILE:

Il nome il file contenente i dati del cookie. Il file cookie può essere in formato Netscape o semplicemente semplici intestazioni in stile HTTP scaricate in un file.

CURLOPT_COOKIE:

Il contenuto del "biscotto:" intestazione da utilizzare nella richiesta HTTP. Si noti che più cookie sono separati da un punto e virgola seguito da uno spazio (ad esempio, "frutto = mela; color = red")

CURLOPT_COOKIEJAR:

ha nome di un file per salvare tutti i cookie interni a quando la connessione chiude.

@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

Grazie - Aggiunto quelli, ma ancora appena stato indirizzato al form di login sul sito esterno .. –

4

questo sembra essere un vero problema quando si cerca di raschiare le pagine ASP.NET.

Le pagine contengono un campo nascosto denominato "__VIEWSTATE" che contiene un insieme codificato Base64 di va e vieni contenente alcuni o tutti lo stato della pagina quando la pagina è stata inviata. Solitamente contiene anche SHA1 del viewstate.

Ciò significa che il tuo post deve contenere tutto in _VIEWSTATE o non funzionerà.

Sono stato in grado di pubblicare una semplice pagina di accesso che ha solo 2 campi ma non una pagina più complessa in cui l'autore ha scelto di mettere l'intero stato della pagina nel viewstate.

Finora non sono stato in grado di trovare una soluzione.

+0

Grazie per la risposta di Ed. Sono anche arrivato alla conclusione che era dovuto ai valori di VIEWSTATE. –