Domanda

Ho un'applet Java che gira all'interno di una pagina aspx autenticata con moduli. Nella versione .NET 1.1 del mio sito, l'applet ha accesso al cookie di sessione ed è in grado di recuperare un file dal server, ma nella versione .NET 2.0 non riesce ad autenticarsi.

Ho visto un paio di post sul forum altrove che affermano che 2.0 imposta i cookie su HttpOnly per impostazione predefinita, ma le soluzioni fornite non hanno funzionato finora per me. Ho anche letto da qualche parte che 2.0 potrebbe essere discriminante in base all'utente-agente.

Qualcuno ha qualche esperienza o intuizione in questo?

È stato utile?

Soluzione

Questa domanda è vecchia, ma ho pensato che fosse utile avere la risposta corretta qui.

Filip confonde Java lato server con Java lato client. Ha ragione sul fatto che non è possibile condividere sessioni tra due piattaforme lato server, come Java (J2EE) e ASP.Net senza utilizzare un approccio personalizzato.

Tuttavia, le applet sono lato client e quindi dovrebbero essere in grado di accedere alle informazioni sulla sessione della pagina host. Il problema è che ASP.Net 2.0 ha aggiunto il flag HttpOnly sui cookie di sessione. Questo flag impedisce alle applet JavaScript e Java di accedere a questi cookie.

La soluzione alternativa è disattivare il flag HttpOnly sui cookie di sessione. Mentre potresti essere in grado di farlo nella configurazione nelle versioni più recenti di ASP.Net, nelle versioni precedenti la soluzione era quella di aggiungere il seguente codice al tuo file 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;
            }
        }
    }
}

Nota che anche con questa correzione, non tutte le combinazioni browser / OS / Java possono accedere ai cookie. Attualmente sto cercando un problema con i cookie di sessione non accessibili su Firefox 4.0.1 con Java 1.6.0_13 su Windows XP.

La soluzione alternativa consiste nell'utilizzare l'approccio suggerito dal Dr. Dad, in cui l'ID sessione viene passato all'applet come parametro e quindi viene incorporato nell'URL della richiesta (richiede che le sessioni URL siano attivate sul lato server configurazione) o inviato come cookie impostato manualmente.

Altri suggerimenti

Filip è sia corretto che errato, almeno scritto su Java e ASP.NET. Un'applet può accedere alla sessione ASP.NET truffando. Nel mio caso, abbiamo aggiunto l'id di sessione come parametro all'applet, che l'applet aggiunge come cookie nelle sue richieste. Sembra funzionare bene. (Abbiamo crittografato l'id di sessione per sventare quelle cattive persone hacker!)

La risposta di Filip non è del tutto corretta. Ho eseguito un programma per annusare le intestazioni HTTP sulla mia stazione di lavoro e l'applet Java in effetti presenta il ticket di autenticazione ASP.NET in alcune circostanze - semplicemente non abbastanza affidabile per le mie esigenze.

Alla fine ho trovato una soluzione a questo, ma non ha risolto del tutto il mio problema. È possibile aggiungere una voce a web.config in .NET 2.0: <httpCookies httpOnlyCookies="false" />; ma questo non ha funzionato per tutti i miei utenti.

La soluzione a lungo termine si è rivelata la modifica dell'applet Java in modo che non sia necessario recuperare nulla dal server Web.

Sono consapevole che potrebbe essere una risposta molto tardi, ma posso darti una soluzione più semplice: - di solito, non sempre, le applet fanno un uso pesante di html e javascript per le loro interfacce e interazioni. - Javascript viene eseguito nel browser. - Le chiamate Ajax vengono effettuate dal browser. - Le chiamate Ajax sono asincrone e possono essere facilmente integrate in una logica di applet.

È possibile trovare un'elegante soluzione che integri le chiamate Ajax alla logica di un'applet, delegando al browser la sicurezza.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top