2010-01-29 3 views
16

Flash 무비에서 HTTP 쿠키에 액세스 할 수 없지만 이제 Flash Player가 자동으로 세션 쿠키를 처리해야한다는 내용을 반복적으로 읽었습니다. 그러나 이것에 관한 문서를 찾을 수는 없으며 기본 JSESSIONID 쿠키를 사용하여 Struts 백엔드에 대해 실행중인 Flex 클라이언트에서 제대로 작동하지 않았습니다.Flash Player는 세션 쿠키를 자동으로 전송합니까?

그래서 Flash Player는 세션 쿠키를 처리합니까 그렇지 않습니까? 그렇다면 어떻게 설정합니까?

답변

6

플래시의 HTTP 요청은 브라우저를 통해 전송되므로 쿠키가 자동으로 전송됩니다. 실제로 현재 HTML 페이지에서 로그인 쿠키를 설정하고 세션 쿠키를 설정하는 사이트를 만든 다음 사용자 만 플래시 전용 페이지()로 전달합니다. 플래시 페이지가 URLLoader & URLRequest을 사용하여 서버에 많은 요청을 보내고 있으며 각각에 대해 세션 쿠키를 확인할 수 있습니다.

즉, ExternalInterface.call()을 사용하여 플래시에서 HTTP 쿠키에 액세스 할 수 있습니다. SWF 포함 코드의 allowScriptAccess이 적절한 값으로 설정되어 있는지 확인하십시오.

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

업데이트 : (순식간에 로그인),하지만 당신은 잘 될 수 있음을 시도하지 않은 - 플래시가 Set-Cookie (또는 모든) 응답 헤더를 무시 될 수 있습니다. 불행히도 Flash는 응답 헤더에 액세스 할 수 없습니다. 그러나 AJAX 응답 (xhr.getResponseHeader 사용)에서 응답 헤더에 액세스 할 수 있으므로 ExternalInterface아웃소싱 AJAX의 로그인 부분을 사용할 수 있습니다. AJAX 응답에서 헤더를 잡고 javascript를 사용하여 쿠키를 설정하십시오 (this SO thread에 따라 브라우저에서 자동으로 처리합니다). 설정되면 플래시에서 전송 된 후속 요청에는 세션 쿠키가 포함됩니다.

ExternalInterface.addCallback 메서드를 사용하면 자바 스크립트에서 호출 할 수있는 플래시 메소드를 등록 할 수 있습니다.

+0

플래시 무비를 시작하기 전에 브라우저에 쿠키가 있어야한다는 의미입니까? 플래시로 로그인했는데 작동하지 않는 것 같습니다. –

+0

@Hanno 플래시를 통한 로그인을 시도하지는 않았지만 해결 방법이 있다고 생각합니다. 업데이트 – Amarghosh

3

일반적으로 Flash Player는 브라우저를 통해 네트워킹을 수행하며,이 경우 설정 및 쿠키 가져 오기가 브라우저에서 완전히 처리됩니다.

사이트가 Set-Cookie를 보내면 작동합니다.

JavaScript에서 액세스 할 수없는 것처럼 Flash 내용에서 응답 헤더에 액세스 할 수 없습니다. 이것이 근본적인 보안상의 이유가 있습니다. 그러나 언젠가 Flash Player에서 자바 스크립트처럼 쿠키 API를 통해 쿠키를 읽을 수도 있습니다. 그 동안 ExternalInterface를 통해 JS를 호출하여 쿠키를 읽을 수 있습니다.

Flash Player가 쿠키를 보내지 않거나 잘못된 쿠키를 보내는 경우가 있습니다. 그것이 FileReference.upload()를 사용하는 경우입니다. 이것은 알려진 Flash Player 버그이지만 NPAPI 종속성 때문에 Adobe에서 해결하기는 매우 어렵습니다.

현재로서는 JSESSIONID는 안전하지 않은 것으로 간주됩니다. 문서가 요청을 하던지간에 브라우저가 맹목적으로 보내므로 CSRF 공격에 취약합니다. 대부분의 현대적인 로그인 시스템은 숨겨진 양식 필드 나 도메인 내 페이지에만 로그인 정보를 액세스 할 수있는 다른 수단을 사용합니다.

위시 특정 앱이 쿠키를 보내지 않는 이유를 알려 드릴 수 있습니다. 모든 HTML 버전과 비교해 보았습니까? 패킷 스니퍼로 두 네트워크 스트림을 감시하고 있습니까?

0

나는이 스레드가 지금은 죽었 으리라 확신하지만 최근에 ASP.NET과 FileUpload를 사용하여 유사한 문제에 직면했으며 here 작업에 기반한 해결 방법을 발견했습니다.

Flex 객체를 페이지에 동적으로 쓰는 구성 요소를 작성하여 UpdatePanels에서 사용할 수 있도록했습니다. 코드 작성을 원하면 메시지를 보내주십시오. URLRequest가 인증 쿠키를 보내야하는 페이지에서 위의 문제를 해결하기 위해 flashVars로 값을 추가합니다.

이 코드는 단지 내 객체로 작동하지만, 당신이 마지막으로 Global.asax에에에 쿠키를 물건 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; 

를 확인 플렉스 개체에 그런 생각을

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); 

를 얻을 수 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) { } 

} 

호프 누군가가이 문제를 해결하기 위해 6 시간을 피하는 데 도움이되기를 바랍니다. Adobe는 문제를 해결할 수 없다고 결론 내 렸습니다. 그래서 이것이 나의 최후의 수단이었습니다.

+1

에서 제공 한 링크에 한 문자가 누락되었습니다. 여기에 올바른 링크가 있습니다. http://swfupload.org/forum/generaldiscussion/98 – Roger

+0

고마워요. Roger. 게시물을 수정하여 링크를 수정했습니다. – Laramie

관련 문제