2008-10-14 51 views
3

我有一个运行在经过Forms-Authenticated aspx页面的Java小程序。在我的网站的.NET 1.1版本中,小程序可以访问会话cookie并能够从服务器检索文件,但在.NET 2.0版本中,它无法进行身份验证。与Java小程序共享ASP.NET会话cookie

我在其他地方看到过一些论坛帖子,指出2.0默认情况下会将cookie设置为HttpOnly,但到目前为止给出的解决方案并没有为我工作。我还在某处读到2.0可能会基于用户代理进行区分。

有没有人有任何经验或见解?

回答

5

这个问题很旧,但我觉得在这里有正确的答案是很有价值的。

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发送。

0

菲利普的答案并不完全正确。我运行了一个程序来侦听工作站上的HTTP头,并且在某些情况下,Java applet实际上提供了ASP.NET身份验证票据 - 只是不足以满足我的需求。

最终我找到了解决方案,但它并没有完全解决我的问题。您可以将条目添加到.NET 2.0中的web.config中:<httpCookies httpOnlyCookies="false" />;但这并不适用于所有用户。

长期的解决方案竟然是修改Java小程序,以便它不需要从Web服务器检索任何东西。

1

Filip是正确和不正确的,至少对于Java和ASP.NET。一个applet可以通过作弊来访问ASP.NET会话。就我而言,我们将会话ID作为参数添加到小程序中,然后小程序将其添加为请求中的cookie。似乎工作正常。 (我们加密会话ID以阻止那些讨厌的黑客民谣!)

0

我知道它可能是一个非常晚的答案,但我可以给你一个更简单的解决方案: - 通常,并不总是,applets大量使用html和javascript进行接口和交互。 - JavaScript在浏览器中运行。 - Ajax调用由浏览器进行。 - Ajax调用是异步的,可以轻松集成到applet逻辑。

可以找到一个优雅的解决方案,将Ajax调用集成到一个applet的逻辑,委托浏览器安全。