Pregunta

Tengo un script de carga de archivos de Flex que utiliza URLRequest para cargar archivos en un servidor. Quiero añadir soporte para la autenticación HTTP (contraseña directorios protegidos en el servidor), pero no sé cómo implementar esta - Asumo que necesito para extender la clase de alguna manera, sino en cómo estoy un poco perdido.

He intentado modificar la siguiente (en sustitución de HTTPService con URLRequest), pero que no funcionó.

private function authAndSend(service:HTTPService):void{        
   var encoder:Base64Encoder = new Base64Encoder();        
   encoder.encode("someusername:somepassword");        
   service.headers = {Authorization:"Basic " + encoder.toString()};
   service.send();
}

Debo señalar que no estoy bien informado cuando se trata de ActionScript / Flex, aunque he logrado modificar satisfactoriamente el script de carga un poco.

[Editar] - aquí es una actualización de mi progreso, basado en la respuesta a continuación, aunque todavía no puedo conseguir que esto funcione:

Gracias por su ayuda. He tratado de poner en práctica su código pero no he tenido suerte.

El comportamiento general estoy experimentando cuando se trata de lugares de autenticación HTTP, es que con IE7 todo está bien, pero en Firefox cuando intento cargar un archivo en el servidor muestra un mensaje de autenticación HTTP - el cual incluso si se les da la información correcta , sólo tiene que atasca el proceso de carga.

Creo que la razón es bien IE7 se ha reducido a la información de la sesión / autenticación sea compartida por el navegador y el componente Flash - sin embargo, en Firefox este no es el caso y que experimento el comportamiento anterior

.

Aquí está mi función de carga actualizada, incorporando los cambios:

private function pergress():void 
{
if (fileCollection.length == 0) 
  {
  var urlString:String = "upload_process.php?folder="+folderId+"&type="+uploadType+"&feid="+formElementId+"&filetotal="+fileTotal;
  if (ExternalInterface.available) 
    {
    ExternalInterface.call("uploadComplete", urlString);
    }
  }
if (fileCollection.length > 0) 
  {
  fileTotal++;
  var urlRequest:URLRequest = new URLRequest("upload_file.php?folder="+folderId+"&type="+uploadType+"&feid="+formElementId+"&obfuscate="+obfuscateHash+"&sessidpass="+sessionPass);
  urlRequest.method = URLRequestMethod.POST;
  urlRequest.data = new URLVariables("name=Bryn+Jones");
  var encoder:Base64Encoder = new Base64Encoder();
  encoder.encode("testuser:testpass");
  var credsHeader:URLRequestHeader = new URLRequestHeader("Authorization", "Basic " + encoder.toString());
  urlRequest.requestHeaders.push(credsHeader);

  file = FileReference(fileCollection.getItemAt(0));
  file.addEventListener(Event.COMPLETE, completeHandler);
  file.addEventListener(HTTPStatusEvent.HTTP_STATUS, onHTTPStatus);
  file.addEventListener(ProgressEvent.PROGRESS, onUploadProgress);
  file.upload(urlRequest);
  }
}

Como se indicó anteriormente, me parece estar experimentando los mismos resultados con o sin las enmiendas a mi función.

¿Puedo preguntar dónde está el crossdomain.xml debe estar ubicado -., Ya que no tiene en la actualidad uno y estoy seguro de dónde colocarlo

¿Fue útil?

Solución

La sintaxis es un poco diferente para URLRequest, pero la idea es la misma:

private function doWork():void
{
    var req:URLRequest = new URLRequest("http://yoursite.com/yourservice.ext");
    req.method = URLRequestMethod.POST;
    req.data = new URLVariables("name=John+Doe");

    var encoder:Base64Encoder = new Base64Encoder();        
    encoder.encode("yourusername:yourpassword");

    var credsHeader:URLRequestHeader = new URLRequestHeader("Authorization", "Basic " + encoder.toString());
    req.requestHeaders.push(credsHeader);

    var loader:URLLoader = new URLLoader();
    loader.load(req);
}

Un par de cosas a tener en cuenta:

  • Lo mejor que puedo decir, por alguna razón, esto sólo funciona en el método de la petición es POST; las cabeceras no se les establecen con peticiones GET.

  • Curiosamente, también falla a menos que al menos un par nombre-valor URLVariables se empaqueta con la solicitud, como se indica anteriormente. Es por eso que muchos de los ejemplos que ver por ahí (incluyendo la mía) adjuntar "name = John Doe +" - es sólo un marcador de posición para algunos datos que URLRequest parece requerir la hora de establecer los encabezados HTTP personalizados. Sin ella, incluso una solicitud POST debidamente autenticado también fallará.

  • Al parecer, la versión de Flash player 9.0.115.0 bloquea completamente todos los encabezados de autorización (más información sobre éste aquí ), por lo que probablemente querrá mantener esto en mente, también.

  • Usted es casi seguro que tiene que modificar su archivo crossdomain.xml para dar cabida a la cabecera (s) que va a ser el envío. En mi caso, estoy usando esto, que es un archivo de política en lugar muy abierto en el que se acepta de cualquier dominio, por lo que en su caso, es posible que desee limitar las cosas un poco más, dependiendo de qué tan consciente de la seguridad está .

crossdomain.xml:

<?xml version="1.0"?>
<cross-domain-policy>
    <allow-access-from domain="*" />
    <allow-http-request-headers-from domain="*" headers="Authorization" />
</cross-domain-policy> 

... y que parece funcionar; más información sobre éste está disponible de Adobe aquí ).

El código anterior se probó con flash player 10 (con la depuración y liberar los FSI), por lo que debe trabajar para usted, pero yo quería actualizar mi post original para incluir toda esta información adicional en caso de que tenga algún problema, como se las posibilidades parecen (por desgracia) probable que se quiere.

Espero que ayude! Buena suerte. Voy a mantener un ojo hacia fuera para comentarios.

Otros consejos

El FileReference.upload () y FileReference.download () métodos no son compatibles con el parámetro URLRequest.requestHeaders.

http://livedocs.adobe.com/flex /2/langref/flash/net/URLRequest.html

Si desea cargar un archivo, sólo tiene que enviar las cabeceras correctas y el contenido del archivo usando URLRequest a través de la clase UploadPostHelper. Esto funciona al 100%, estoy usando esta clase para subir imágenes generadas y archivos CSV, pero se puede subir cualquier tipo de archivo.

Esta clase simplemente prepara la solicitud con cabeceras y el contenido como si usted estaría cargando el archivo de un formulario HTML.

http: // código. google.com/p/as3asclublib/source/browse/trunk/net/UploadPostHelper.as?r=118

_urlRequest = new URLRequest(url);
        _urlRequest.data = "LoG";
        _urlRequest.method = URLRequestMethod.POST; 

        _urlRequest.requestHeaders.push(new URLRequestHeader("X-HTTP-Code-Override", "true"));
        _urlRequest.requestHeaders.push(new URLRequestHeader("pragma", "no-cache"));

        initCredentials();
_loader.dataFormat = URLLoaderDataFormat.BINARY;
            //this creates a security problem, putting the content type in the headers bypasses this problem
            //_urlRequest.contentType = 'multipart/form-data; boundary=' + UploadPostHelper.getBoundary();
            _urlRequest.requestHeaders.push( new URLRequestHeader( 'Cache-Control', 'no-cache' ) );
            _urlRequest.requestHeaders.push(new URLRequestHeader('Content-Type', 'multipart/form-data; boundary=' + UploadPostHelper.getBoundary()));
            _urlRequest.data = UploadPostHelper.getPostData("file.csv", param[1]);

        _loader.load(_urlRequest);

No estoy seguro de esto, pero ¿ha tratado de añadir nombre de usuario: contraseña @ al comienzo de su URL

" http: // nombre de usuario: password@yoursite.com/yourservice.ext "

var service : HTTPService  = new HTTPService ();
var encoder:Base64Encoder = new Base64Encoder();
encoder.insertNewLines = false;
encoder.encode("user:password");

service.headers = {Authorization:"Basic " + encoder.toString()};
service.method = HTTPRequestMessage.POST_METHOD;
service.request = new URLVariables("name=John+Doe");
service.addEventListener(FaultEvent.FAULT,error_handler );
service.addEventListener(ResultEvent.RESULT,result_handler);
service.url = 'http://blah.blah.xml?'+UIDUtil.createUID();
service.send();

problema aparentemente similares se resolvió aquí . Los insto a comprobar también la Flexcoders posterior el vínculo en el el primer mensaje.

El problema fue que Firefox utiliza una instancia nueva ventana del navegador para enviar la solicitud de carga de archivos. La solución es para fijar manualmente el identificador de sesión a la solicitud de URL. El identificador de sesión no se adjunta como una variable GET normal, pero con un punto y coma (la razón de esta sintaxis es desconocido para mí).

Flash es muy limitado en términos de qué tipo de cabeceras puede pasar con una petición HTTP (y cambia entre los navegadores y sistemas operativos). Si usted consigue esto funcione en un navegador / OS, asegúrese de probar que en los otros.

Lo mejor que puede hacer es no meterse con las cabeceras HTTP.

Tenemos el mismo tema (la posibilidad de subir a los álbumes web de Picasa de la memoria flash) y la entrada a través de un proxy en nuestro servidor. Pasamos las cabeceras extra a través de correos como parámetros y nuestro proxy no lo correcto.

" http: // nombre de usuario: password@yoursite.com/yourservice.ext "

Esto no funciona en IE ( http: // www. theregister.co.uk/2004/01/30/ms_drop_authentication_technique/ ) y no parece funcionar en Chrome tampoco.

probablemente no utilizable en flash

Aquí es un trabajo en torno al utilizar ASP.Net basada en parte en el trabajo aquí .

he construido un componente que escribe dinámicamente objetos de Flex a la página para que puedan ser utilizados en UpdatePanels. Un mensaje si usted quiere que codifican. Para resolver el problema anterior en páginas en las que tendrán que ser enviado por URLRequest cookies de autenticación, añado los valores en que 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 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;

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) { }   

}

Espero que esto ayuda a alguien a evitar las 6 horas Acabo de pasar frente a este. Adobe ha cerrado el tema como irresoluble, por lo que este era mi último recurso.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top