在Flash电影中无法访问HTTP cookies,但我已经多次阅读到Flash Player应该自动处理会话cookies。然而,我找不到任何关于此的文档,并且使用默认的JSESSIONID cookie将我的Flex客户端与Struts后端一起运行时并没有起作用。
那么,Flash Player是否处理会话cookies?如果是,我该如何设置它?
URLLoader
和URLRequest
向服务器发送大量请求,我能够验证每个请求的会话cookie。var cookies:String = ExternalInterface.call("function()
{
return document.cookie;
}()");
Set-Cookie
(或全部)响应头。不幸的是,Flash也不允许我们访问响应头。但由于可以在AJAX响应中访问响应头(使用xhr.getResponseHeader
),因此您可以使用ExternalInterface
并将登录部分外包到AJAX中。在AJAX响应中获取标头并使用javascript设置cookie(根据this SO thread,浏览器将自动执行此操作)。设置后,从flash发送的后续请求将包含其中的会话cookie。ExternalInterface.addCallback
方法注册一个可从javascript调用的flash方法。通常情况下,Flash Player通过浏览器进行网络传输,此时设置和获取cookie完全由浏览器处理。
如果一个站点发送了Set-Cookie,那应该是有效的。
您不能从Flash内容中访问响应头,就像无法从JavaScript中访问一样;这是基本安全原因。但是,有可能将来Flash Player会允许您通过Cookie API读取cookie,就像JavaScript一样。同时,ExternalInterface可以让您调用JS以读取cookie。
有一种情况下,Flash Player不会发送cookie,甚至可能发送错误的cookie。那就是当您使用FileReference.upload()时。这是一个已知的Flash Player漏洞,尽管Adobe非常难以解决,因为它涉及到NPAPI依赖项。
顺便说一句,JSESSIONID目前被认为不安全。由于浏览器会盲目发送它,而不管请求的文档属于谁,因此它容易受到CSRF攻击。大多数现代登录系统使用隐藏的表单字段或其他方法,仅使登录nonce可被域内页面访问。
希望我能告诉您为什么您特定的应用程序没有发送cookie。您是否尝试将其与全HTML版本进行比较?您是否使用数据包嗅探器监视了两个网络流?
这个问题是10年前提出的,但我想对未来的读者说些什么。
Flash Player不会在请求中传输默认的JSESSIONID,并且在您设置了SameSite=None的JSESSIONID cookie之前无法这样做。
我曾经遇到过JSESSIONID cookie在请求中被删除的问题,后来发现这是因为现代浏览器(chrome > 80)不允许Flash Player访问没有SameSite=None和Secure flash的JSESSIONID cookie。
请阅读Adobe的公告here 更多关于新cookie策略的阅读:
我相信这个帖子现在已经过时了,但我最近在使用ASP.NET和FileUpload时遇到了类似的问题,并根据这里的一些工作找到了一个解决方法。
我构建了一个组件,动态地将Flex对象写入页面,以便它们可以在UpdatePanels中使用。如果您想要代码,请给我发消息。为了解决在需要通过URLRequest发送身份验证cookie的页面上述问题,我将值添加为flashVars。
这段代码只适用于我的对象,但您可以理解其中的思路。
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);
然后在 Flex 对象中检查参数
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;
最后,在 global.asax 的 BeginRequest 中塞入 cookies。
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) { }
}