Question

J'ai un applet Java qui s'exécute dans une page ASPX authentifiée par les formulaires. Dans la version .NET 1.1 de mon site, l'applet a accès au cookie de session et peut extraire un fichier du serveur, mais dans la version .NET 2.0, l'authentification échoue.

J'ai vu quelques articles de forum ailleurs affirmant que la version 2.0 définit les cookies sur HttpOnly par défaut, mais les solutions proposées ne fonctionnent pas pour moi jusqu'à présent. J'ai aussi lu quelque part que 2.0 peut être discriminant en fonction de l'utilisateur-agent.

Quelqu'un at-il une expérience ou une idée de cela?

Était-ce utile?

La solution

Cette question est ancienne, mais j’ai pensé qu’il était utile d’avoir la bonne réponse ici.

Filip crée une confusion entre Java côté serveur et Java côté client. Il a raison de dire que vous ne pouvez pas partager de sessions entre deux plates-formes côté serveur, telles que Java (J2EE) et ASP.Net, sans utiliser une approche personnalisée.

Cependant, les applets sont côté client et devraient donc pouvoir accéder aux informations de session de la page hôte. Le problème est que ASP.Net 2.0 a ajouté l'indicateur HttpOnly sur les cookies de session. Cet indicateur empêche les applets JavaScript et Java d’accéder à ces cookies.

La solution de contournement consiste à désactiver le drapeau HttpOnly sur les cookies de session. Bien que vous puissiez le faire lors de la configuration dans les versions plus récentes d’ASP.Net, la solution consistait auparavant à ajouter le code suivant à votre fichier 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;
            }
        }
    }
}

Notez que même avec ce correctif, toutes les combinaisons navigateur / système d'exploitation / Java ne peuvent pas accéder aux cookies. Je suis actuellement à la recherche d'un problème avec les cookies de session qui ne sont pas accessibles sur Firefox 4.0.1 avec Java 1.6.0_13 sous Windows XP.

La solution de contournement consiste à utiliser l'approche suggérée par Dr. Dad, dans laquelle l'ID de session est transmis à l'applet en tant que paramètre, puis soit incorporé dans l'URL de la demande (nécessite que les sessions d'URL soient activées côté serveur. configuration) ou envoyé sous forme de cookie défini manuellement.

Autres conseils

Filip est à la fois correct et incorrect, du moins en Java et ASP.NET. Un applet peut accéder à la session ASP.NET en trichant. Dans mon cas, nous avons ajouté l'identifiant de session en tant que paramètre à l'applet, que l'applet ajoute ensuite en tant que cookie dans ses demandes. Semble travailler ok. (Nous avons chiffré l'identifiant de session pour déjouer ces méchants hacker!)

La réponse de Filip n’est pas tout à fait correcte. J'ai lancé un programme pour détecter les en-têtes HTTP sur mon poste de travail. En réalité, l'applet Java présente le ticket d'authentification ASP.NET dans certaines circonstances, mais pas assez pour répondre à mes besoins.

Finalement, j'ai trouvé une solution à ce problème, mais cela n'a pas entièrement résolu mon problème. Vous pouvez ajouter une entrée au web.config dans .NET 2.0: <httpCookies httpOnlyCookies="false" />; mais cela n'a pas fonctionné pour tous mes utilisateurs.

La solution à long terme s'est avérée être de modifier l'applet Java afin qu'il n'ait pas besoin de récupérer quoi que ce soit du serveur Web.

Je suis conscient que la réponse peut être très tardive, mais je peux vous donner une solution plus simple: - généralement, pas toujours, les applets font un usage intensif de HTML et de javascript pour leurs interfaces et leurs interactions. - Javascript est exécuté dans le navigateur. - Les appels Ajax sont effectués par le navigateur. - Les appels Ajax sont asynchrones et peuvent être facilement intégrés à une logique d'applets.

On peut trouver une solution élégante intégrant les appels Ajax à la logique d’une applet, en déléguant la sécurité au navigateur.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top