3

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

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

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

4

4 回答 4

5

这个问题很老,但我认为在这里得到正确答案很有价值。

Filip 混淆了服务器端 Java 和客户端 Java。他是正确的,如果不使用自定义方法,您将无法在两个服务器端平台(例如 Java (J2EE) 和 ASP.Net)之间共享会话。

然而,小程序是客户端的,因此应该能够访问主机页面的会话信息。问题是 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 发送。

于 2011-09-06T03:25:04.807 回答
1

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

于 2010-11-30T20:15:55.867 回答
0

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

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

长期的解决方案是修改 Java 小程序,使其不需要从 Web 服务器检索任何内容。

于 2009-03-17T23:52:36.043 回答
0

我知道这可能是一个很晚的答案,但我可以给你一个更简单的解决方案: - 通常,并非总是如此,小程序大量使用 html 和 javascript 来进行界面和交互。- Javascript 在浏览器中运行。- Ajax 调用由浏览器进行。- Ajax 调用是异步的,可以很容易地集成到小程序逻辑中。

One can find an elegant solution integrating Ajax calls to an applet's logic, delegating to the browser the security.

于 2012-04-10T13:16:23.053 回答