2008-10-14 30 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的邏輯,委託瀏覽器安全。