我有一个运行在经过Forms-Authenticated aspx页面的Java小程序。在我的网站的.NET 1.1版本中,小程序可以访问会话cookie并能够从服务器检索文件,但在.NET 2.0版本中,它无法进行身份验证。与Java小程序共享ASP.NET会话cookie
我在其他地方看到过一些论坛帖子,指出2.0默认情况下会将cookie设置为HttpOnly,但到目前为止给出的解决方案并没有为我工作。我还在某处读到2.0可能会基于用户代理进行区分。
有没有人有任何经验或见解?
我有一个运行在经过Forms-Authenticated aspx页面的Java小程序。在我的网站的.NET 1.1版本中,小程序可以访问会话cookie并能够从服务器检索文件,但在.NET 2.0版本中,它无法进行身份验证。与Java小程序共享ASP.NET会话cookie
我在其他地方看到过一些论坛帖子,指出2.0默认情况下会将cookie设置为HttpOnly,但到目前为止给出的解决方案并没有为我工作。我还在某处读到2.0可能会基于用户代理进行区分。
有没有人有任何经验或见解?
这个问题很旧,但我觉得在这里有正确的答案是很有价值的。
Filip令服务器端Java与客户端Java混淆。他是正确的,您不能在两个服务器端平台(如Java(J2EE)和ASP.Net)之间共享会话,而无需使用自定义方法。
但是,applet是客户端,因此应该能够访问主机页面的会话信息。问题是ASP.Net 2.0在会话cookie上添加了HttpOnly标志。该标志防止JavaScript和Java小程序访问这些cookie。
解决方法是关闭会话cookie上的HttpOnly标志。虽然你可能能够做到这一点在ASP.Net的较新版本的配置,在以前版本的解决方案是将下面的代码添加到您的Global.asax文件:
protected void Application_EndRequest(object sender, EventArgs e)
{
/**
* @note Remove the HttpOnly attribute from session cookies, otherwise the
* Java applet won't have access to the session. This solution taken
* from
* http://blogs.msdn.com/jorman/archive/2006/03/05/session-loss-after-migrating-to-asp-net-2-0.aspx
*
* For more information on the HttpOnly attribute see:
*
* http://msdn.microsoft.com/netframework/programming/breakingchanges/runtime/aspnet.aspx
* http://msdn2.microsoft.com/en-us/library/system.web.httpcookie.httponly.aspx
*/
if (Response.Cookies.Count > 0)
{
foreach (string lName in Response.Cookies.AllKeys)
{
if (lName == FormsAuthentication.FormsCookieName ||
lName.ToLower() == "asp.net_sessionid")
{
Response.Cookies[lName].HttpOnly = false;
}
}
}
}
注意,即使使用此修复程序,并非所有浏览器/操作系统/ Java组合都可以访问Cookie。我目前正在用Windows XP上的Java 1.6.0_13在Firefox 4.0.1上无法访问会话cookie来研究问题。
解决方法是使用Dr.Dad建议的方法,将会话ID作为参数传递给小程序,然后嵌入到请求URL中(需要在服务器端启用URL会话 - 或者作为手动设置的cookie发送。
菲利普的答案并不完全正确。我运行了一个程序来侦听工作站上的HTTP头,并且在某些情况下,Java applet实际上提供了ASP.NET身份验证票据 - 只是不足以满足我的需求。
最终我找到了解决方案,但它并没有完全解决我的问题。您可以将条目添加到.NET 2.0中的web.config中:<httpCookies httpOnlyCookies="false" />
;但这并不适用于所有用户。
长期的解决方案竟然是修改Java小程序,以便它不需要从Web服务器检索任何东西。
Filip是正确和不正确的,至少对于Java和ASP.NET。一个applet可以通过作弊来访问ASP.NET会话。就我而言,我们将会话ID作为参数添加到小程序中,然后小程序将其添加为请求中的cookie。似乎工作正常。 (我们加密会话ID以阻止那些讨厌的黑客民谣!)
我知道它可能是一个非常晚的答案,但我可以给你一个更简单的解决方案: - 通常,并不总是,applets大量使用html和javascript进行接口和交互。 - JavaScript在浏览器中运行。 - Ajax调用由浏览器进行。 - Ajax调用是异步的,可以轻松集成到applet逻辑。
可以找到一个优雅的解决方案,将Ajax调用集成到一个applet的逻辑,委托浏览器安全。