ASP.NETセッションCookieをJavaアプレットと共有する
質問
フォーム認証のaspxページ内で実行されるJavaアプレットがあります。私のサイトの.NET 1.1バージョンでは、アプレットはセッションCookieにアクセスでき、サーバーからファイルを取得できますが、.NET 2.0バージョンでは認証に失敗します。
2.0ではデフォルトでCookieがHttpOnlyに設定されると述べているいくつかのフォーラムの投稿を見てきましたが、ここまでのソリューションは今のところうまくいきませんでした。また、2.0がユーザーエージェントに基づいて差別化している可能性があることも読んでいます。
これに関する経験や洞察力はありますか?
解決
この質問は古いですが、ここで正しい答えを得ることが価値があると考えました。
Filipは、サーバー側のJavaとクライアント側のJavaを混同しています。彼は、Java(J2EE)とASP.Netなどの2つのサーバー側プラットフォーム間で、カスタムアプローチを使用せずにセッションを共有することはできないと言っています。
ただし、アプレットはクライアント側であるため、ホストページのセッション情報にアクセスできる必要があります。問題は、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にアクセスできない問題を調査しています。
回避策は、Dad博士が提案したアプローチを使用することです。このアプローチでは、セッションIDがパラメーターとしてアプレットに渡され、リクエストURLに埋め込まれます(サーバー側でURLセッションをオンにする必要があります)構成)または手動で設定されたCookieとして送信されます。
他のヒント
Filipは、少なくともJavaとASP.NETにとっては正しいものと間違ったものの両方です。アプレットは、チートすることでASP.NETセッションにアクセスできます。私の場合、セッションIDをパラメーターとしてアプレットに追加し、アプレットはそれをリクエストにCookieとして追加します。うまくいくようです。 (セッションIDを暗号化して、これらの厄介なハッカーの人々を阻止しました!)
Filipの答えは完全に正しいわけではありません。ワークステーションでHTTPヘッダーをスニッフィングするプログラムを実行しましたが、実際には、Javaアプレットは特定の状況でASP.NET認証チケットを提示します-ニーズに十分な信頼性がありません。
やがてこれに対する解決策を見つけましたが、私の問題を完全には解決しませんでした。 .NET 2.0のweb.configにエントリを追加できます:<httpCookies httpOnlyCookies="false" />
;しかし、これは私のすべてのユーザーには機能しませんでした。
長期的な解決策は、Webサーバーから何も取得する必要がないようにJavaアプレットを変更することでした。
非常に遅い回答になる可能性があることは承知していますが、より簡単な解決策を提供できます。 -通常、常にではありませんが、アプレットはインターフェイスと相互作用にhtmlとjavascriptを多用します。 -Javascriptがブラウザーで実行されます。 -Ajax呼び出しはブラウザーによって行われます。 -Ajax呼び出しは非同期であり、アプレットロジックに簡単に統合できます。
Ajax呼び出しをアプレットのロジックに統合し、ブラウザにセキュリティを委任するエレガントなソリューションを見つけることができます。