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 などの 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 にアクセスできない問題を調査しています。

回避策は、Dr. Dad が提案したアプローチを使用することです。この方法では、セッション ID がパラメーターとしてアプレットに渡され、リクエスト URL に埋め込まれます (サーバー側の構成で URL セッションをオンにする必要があります)。手動で設定された Cookie として送信されます。

于 2011-09-06T03:25:04.807 に答える
1

少なくとも Java と ASP.NET に関しては、Filip は正しくもあり、正しくもありません。アプレットは不正行為によって ASP.NET セッションにアクセスできます。私の場合、セッション ID をパラメーターとしてアプレットに追加し、アプレットはこれを Cookie としてリクエストに追加しました。うまくいくようです。(セッション ID を暗号化して、厄介なハッカーを阻止しました!)

于 2010-11-30T20:15:55.867 に答える
0

非常に遅い答えかもしれないことを私は知っていますが、私はあなたにもっと簡単な解決策を与えることができます:-通常、常にではありませんが、アプレットはインターフェースと相互作用のためにhtmlとjavascriptを多用します。-Javascriptはブラウザで実行されます。-Ajax呼び出しはブラウザーによって行われます。-Ajax呼び出しは非同期であり、アプレットロジックに簡単に統合できます。

Ajax呼び出しをアプレットのロジックに統合し、ブラウザーにセキュリティを委任する洗練されたソリューションを見つけることができます。

于 2012-04-10T13:16:23.053 に答える
0

フィリップの答えは完全に正しいわけではありません。ワークステーションで HTTP ヘッダーをスニッフィングするプログラムを実行しましたが、Java アプレットは実際に状況によっては ASP.NET 認証チケットを提示します。

最終的にこれに対する解決策を見つけましたが、問題を完全に解決することはできませんでした。.NET 2.0 の web.config にエントリを追加できます<httpCookies httpOnlyCookies="false" />。しかし、これは私のすべてのユーザーにとってうまくいきませんでした。

長期的な解決策は、Web サーバーから何も取得する必要がないように Java アプレットを変更することであることが判明しました。

于 2009-03-17T23:52:36.043 に答える