2010-01-29 14 views
16

No hay acceso a las cookies HTTP desde dentro de una película Flash, pero ahora he leído en repetidas ocasiones que Flash Player debe ocuparse de las cookies de sesión automáticamente. Sin embargo, no pude encontrar ninguna documentación sobre esto y, desde luego, no funcionó con mi cliente Flex corriendo contra un servidor de Struts usando la cookie JSESSIONID predeterminada.¿Flash Player transmite las cookies de sesión automáticamente?

Entonces, ¿Flash Player maneja las cookies de sesión o no, y si lo hace, cómo lo configuro?

Respuesta

6

Las solicitudes HTTP de Flash se envían a través del navegador, por lo que las cookies se transmiten automáticamente. De hecho, actualmente estoy haciendo un sitio que maneja el inicio de sesión (y, por lo tanto, establece la cookie de sesión) en una página HTML y luego reenvía al usuario a una página de solo Flash(). La página flash está enviando muchas solicitudes al servidor usando URLLoader & URLRequest y puedo verificar la cookie de sesión para cada una de ellas.

Dicho esto, puede acceder a las cookies HTTP desde Flash usando ExternalInterface.call(). Asegúrese de que allowScriptAccess en el código de inserción de SWF esté configurado en el valor apropiado.

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

Actualización: No he probado que (login en flash), pero que podría ser adecuado - Flash podría estar ignorando el Set-Cookie (o todos) los encabezados de respuesta. Y desafortunadamente Flash tampoco nos permite acceder a los encabezados de respuesta. Pero dado que es posible acceder a los encabezados de respuesta en una respuesta AJAX (usando xhr.getResponseHeader) puede usar ExternalInterface y tercerizar la parte de inicio de sesión de AJAX. Coge los encabezados en la respuesta AJAX y configura la cookie usando javascript (de acuerdo con this SO thread, el navegador lo hará automáticamente). Una vez establecido, las solicitudes posteriores enviadas desde el flash incluirían la cookie de sesión en ellas.

Utilice el método ExternalInterface.addCallback para registrar un método flash que se pueda llamar desde javascript.

+0

¿Esto significa que el navegador debe tener las cookies antes de iniciar la película Flash? Hago login en Flash, y eso no parece funcionar. –

+0

@Hanno No he intentado iniciar sesión a través de Flash, pero creo que hay una solución alternativa: consulte la actualización – Amarghosh

3

Flash Player generalmente hace sus redes a través del navegador, en cuyo caso el navegador maneja completamente la configuración y obtención de cookies.

Si un sitio envía Set-Cookie, debería funcionar.

No puede acceder a los encabezados de respuesta desde el contenido de Flash, del mismo modo que no puede acceder a ellos desde JavaScript; hay razones de seguridad fundamentales por las que esto es así. Sin embargo, es posible que algún día Flash Player pueda permitirle leer cookies a través de una API de cookies, tal como lo hace JavaScript. Mientras tanto, ExternalInterface te permitirá llamar a JS para leer las cookies.

Existe un caso en el que Flash Player no envía cookies, o incluso puede enviar las cookies incorrectas. Eso es cuando estás usando FileReference.upload(). Este es un error conocido de Flash Player, aunque es muy difícil de resolver para Adobe, debido a las dependencias NPAPI.

BTW, JSESSIONID se considera inseguro en este momento. Es vulnerable a los ataques de CSRF porque el navegador lo enviará ciegamente, sin importar de qué documento haga la solicitud. La mayoría de los sistemas de inicio de sesión modernos usan un campo de formulario oculto u otros medios para mantener el acceso de inicio de sesión accesible únicamente para las páginas de su dominio.

Desearía poder decirle por qué su aplicación en particular no está enviando cookies. ¿Has intentado compararlo con una versión totalmente HTML? ¿Has espiado en ambas transmisiones de red con un detector de paquetes?

0

Estoy seguro de que este hilo ya está muerto, pero recientemente me enfrenté a un problema similar al utilizar ASP.NET y FileUpload, y encontré una solución alternativa basada en parte del trabajo here.

Creé un componente que escribe dinámicamente objetos Flex en la página para que puedan ser utilizados en UpdatePanels. Envíame un mensaje si quieres que codifiquen. Para resolver el problema anterior en páginas donde las cookies de autenticación necesitarán ser enviadas por URLRequest, agrego los valores en flashVars.

Este código sólo funciona en mi objeto, pero se entiende la 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); 

A continuación, en el objeto de Flex, la verificación de los parametros

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; 

Finalmente meter las galletas en el 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) { } 

} 

esperanza esta ayuda a alguien a evitar las 6 horas Acabo de pasar frente a este. Adobe ha cerrado el problema como irresoluble, por lo que este fue mi último recurso.

+1

al enlace que proporcionó le falta un carácter. aquí está el enlace correcto: http://swfupload.org/forum/generaldiscussion/98 – Roger

+0

Gracias Roger. Edité la publicación para arreglar el enlace. – Laramie

Cuestiones relacionadas