我有一个在经过表单身份验证的aspx页面内运行的Java applet。在我的站点的.NET 1.1版本中,applet可以访问会话cookie并且能够从服务器检索文件,但是在.NET 2.0版本中它无法进行身份验证。

我在其他地方看到过几个论坛帖子,声明默认情况下2.0会将Hets设置为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;
            }
        }
    }
}

请注意,即使使用此修复程序,并非所有浏览器/ OS / Java组合都可以访问Cookie。我目前正在研究在Windows XP上使用Java 1.6.0_13在Firefox 4.0.1上无法访问会话cookie的问题。

解决方法是使用Dr. Dad建议的方法,其中会话ID作为参数传递给applet,然后嵌入到请求URL中(需要在服务器端打开URL会话)配置)或作为手动设置的cookie发送。

其他提示

Filip是正确和错误的,至少对Java和ASP.NET来说是这样。 applet可以通过作弊来访问ASP.NET会话。在我的例子中,我们将会话ID作为参数添加到applet中,然后applet将其作为cookie添加到其请求中。似乎工作正常。 (我们加密会话ID以阻止那些讨厌的黑客们!)

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

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

长期解决方案最终修改了Java applet,因此无需从Web服务器检索任何内容。

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

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top