2010-01-29 24 views
16

Non è possibile accedere ai cookie HTTP da un filmato Flash, ma ora ho ripetutamente letto che Flash Player si suppone che si occupi automaticamente dei cookie di sessione. Tuttavia, non sono riuscito a trovare alcuna documentazione al riguardo e sicuramente non ha funzionato con il mio client Flex in esecuzione su un backend Struts utilizzando il cookie JSESSIONID predefinito.Flash Player trasmette automaticamente i cookie di sessione?

Quindi, Flash Player gestisce i cookie di sessione o no, e in caso affermativo, come faccio a configurarlo?

risposta

6

Le richieste HTTP da Flash vengono inviate tramite il browser, quindi sì, i cookie vengono trasmessi automaticamente. Infatti, attualmente sto facendo un sito che gestisce l'accesso (e quindi l'impostazione del cookie di sessione) in una pagina HTML e quindi inoltra l'utente a una pagina solo Flash(). La pagina flash sta inviando molte richieste al server utilizzando URLLoader & URLRequest e sono in grado di verificare il cookie di sessione per ognuno di questi.

Detto questo, è possibile accedere ai cookie HTTP da Flash utilizzando ExternalInterface.call(). Assicurarsi che allowScriptAccess nel codice di incorporamento SWF sia impostato sul valore appropriato.

var cookies:String = ExternalInterface.call("function() 
    { 
     return document.cookie; 
    }()"); 

Update: Non ho provato che (di login in flash), ma si potrebbe essere di destra - Flash potrei essere ignorando il Set-Cookie (o tutte) le intestazioni di risposta. E sfortunatamente Flash non ci permette di accedere alle intestazioni di risposta. Ma poiché è possibile accedere alle intestazioni di risposta in una risposta AJAX (utilizzando xhr.getResponseHeader) è possibile utilizzare ExternalInterface e esternalizzare la parte di accesso in AJAX. Prendi le intestazioni nella risposta AJAX e imposta il cookie usando javascript (secondo lo this SO thread, il browser lo farà automaticamente). Una volta impostato, le richieste successive inviate dal flash includevano il cookie di sessione al loro interno.

Utilizzare il metodo ExternalInterface.addCallback per registrare un metodo flash da richiamare da javascript.

+0

Ciò significa che il browser deve avere i cookie prima di avviare il filmato Flash? Faccio il login in Flash, e non sembra funzionare. –

+0

@Hanno Non ho provato l'accesso tramite Flash, ma penso che ci sia una soluzione alternativa - vedi l'aggiornamento – Amarghosh

3

Flash Player di solito fa il suo collegamento in rete tramite il browser, nel qual caso l'impostazione e il recupero dei cookie viene interamente gestita dal browser.

Se un sito invia Set-Cookie, dovrebbe funzionare.

Non è possibile accedere alle intestazioni di risposta dal contenuto Flash, così come non è possibile accedervi da JavaScript; ci sono motivi di sicurezza fondamentali perché è così. Tuttavia, è possibile che un giorno Flash Player ti consenta di leggere i cookie tramite un'API di cookie, proprio come fa JavaScript. Nel frattempo, ExternalInterface ti consentirà di chiamare JS per leggere i cookie.

C'è un caso in cui Flash Player non invia cookie o potrebbe persino inviare i cookie sbagliati. Questo è quando si utilizza FileReference.upload(). Si tratta di un bug noto di Flash Player, anche se molto difficile da risolvere per Adobe, a causa delle dipendenze NPAPI.

BTW, JSESSIONID è considerato non sicuro a questo punto. È vulnerabile agli attacchi CSRF perché il browser lo invierà ciecamente, indipendentemente dal documento che sta facendo la richiesta. La maggior parte dei sistemi di accesso moderni utilizza un campo modulo nascosto o altri mezzi per mantenere il login nonce accessibile solo alle pagine del tuo dominio.

Vorrei poterti dire perché la tua particolare app non sta inviando cookies. Hai provato a confrontarlo con una versione completamente HTML? Hai spiato entrambi i flussi di rete con uno sniffer di pacchetti?

0

Sono sicuro che questo thread è ormai morto, ma di recente mi sono trovato di fronte a un problema simile con ASP.NET e FileUpload e ho trovato un work-around basato su alcuni dei lavori here.

Ho creato un componente che scrive dinamicamente gli oggetti Flex sulla pagina in modo che possano essere utilizzati in UpdatePanel. Inviami un messaggio se vuoi che codificano. Per risolvere il problema sopra riportato nelle pagine in cui i cookie di autenticazione dovranno essere inviati da URLRequest, aggiungo i valori come flashVars.

Questo codice funziona solo nel mio oggetto, ma si ottiene l'idea

Dictionary<string, string> flashVars = new Dictionary<string, string>();  
flashVars.Add("auth", Request.Cookies["LOOKINGGLASSFORMSAUTH"].Value); 
flashVars.Add("sess", Request.Cookies["ASP.NET_SessionId"].Value); 
myFlexObject.SetFlashVars(flashVars); 

Poi nell'oggetto Flex, controllare i params

if (Application.application.parameters.sess != null) 
    sendVars.sess= Application.application.parameters.sess; 
if (Application.application.parameters.auth != null) 
    sendVars.au= Application.application.parameters.auth; 

request.data = sendVars; 
request.url = url; 
request.method = URLRequestMethod.POST; 

Infine farcire i biscotti in su global.asax BeginRequest

if (Request.RequestType=="POST" && Request.Path.EndsWith("upload.aspx")) 
{ 
    try 
    { 
     string session_param_name = "sess"; 
     string session_cookie_name = "ASP.NET_SESSIONID"; 
     string session_value = Request.Form[session_param_name]; // ?? Request.QueryString[session_param_name]; 
     if (session_value != null) { UpdateCookie(session_cookie_name, session_value); } 
    } 
    catch (Exception) { } 

    try 
    { 
     string auth_param_name = "au"; 
     string auth_cookie_name = FormsAuthentication.FormsCookieName; 
     string auth_value = Request.Form[auth_param_name];// ?? Request.QueryString[auth_param_name]; 

     if (auth_value != null) { UpdateCookie(auth_cookie_name, auth_value); } 
    } 
    catch (Exception) { } 

} 

Spero che questo aiuti qualcuno a evitare le 6 ore che ho appena trascorso affrontando questo. Adobe ha chiuso il problema in modo irrisolvibile, quindi questa è stata la mia ultima risorsa.

+1

il link che hai fornito manca un personaggio. questo è il link corretto: http://swfupload.org/forum/generaldiscussion/98 – Roger

+0

Grazie Roger. Ho modificato il post per risolvere il collegamento. – Laramie