Compartilhando cookies de sessão do ASP.NET com um applet Java

Eu tenho um applet Java que é executado dentro de uma página aspx autenticada por formulários. Na versão .NET 1.1 do meu site, o applet tem acesso ao cookie de sessão e é capaz de recuperar um arquivo do servidor, mas na versão do .NET 2.0 ele não consegue autenticar.

Eu vi um par de posts em outros lugares que afirmam que 2.0 define cookies para HttpOnly por padrão, mas as soluções dadas não funcionaram para mim até agora. Eu também li em algum lugar que 2.0 pode ser discriminando com base no user-agent.

Alguém tem alguma experiência ou insight sobre isso?

3

4 Respostas

Essa pergunta é antiga, mas achei valioso ter a resposta correta aqui.

Filip está confundindo o Java do lado do servidor com o Java do lado do cliente. Ele está certo de que você não pode compartilhar sessões entre duas plataformas do lado do servidor, como Java (J2EE) e ASP.Net sem usar uma abordagem personalizada.

No entanto, os applets são do lado do cliente e, portanto, devem poder acessar as informações da sessão da página do host. O problema é que o ASP.Net 2.0 adicionou o sinalizador HttpOnly nos cookies de sessão. Esse sinalizador impede que JavaScript e applets Java acessem esses cookies.

A solução alternativa é desativar o sinalizador HttpOnly nos cookies de sessão. Embora você possa fazer isso na configuração em versões mais recentes do ASP.Net, em versões anteriores, a solução era adicionar o seguinte código ao seu arquivo 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;
            }
        }
    }
}

Observe que, mesmo com essa correção, nem todas as combinações de navegador/OS/Java podem acessar cookies. Atualmente estou pesquisando um problema com cookies de sessão não acessíveis no Firefox 4.0.1 com o Java 1.6.0_13 no Windows XP.

A solução alternativa é usar a abordagem sugerida pelo Dr. Dad, em que o ID da sessão é passado para o applet como um parâmetro e, em seguida, é incorporado à URL de solicitação (requer que as sessões de URL sejam ativadas na configuração do servidor) ou enviado como um cookie definido manualmente.

5
adicionado

Filip está correto e incorreto, pelo menos para Java e ASP.NET. Um applet pode obter acesso à sessão do ASP.NET por meio de trapaça. No meu caso, adicionamos o id da sessão como um parâmetro ao applet, que o applet então adiciona como um cookie em suas solicitações. Parece funcionar ok. (Nós criptografamos o id da sessão para frustrar aqueles malditos hackers!)

1
adicionado

Estou ciente de que pode ser uma resposta muito tardia, mas posso dar-lhe uma solução mais simples: - geralmente, nem sempre, os applets fazem uso pesado de html e JavaScript para suas interfaces e interação. - Javascript é executado no navegador. - Chamadas Ajax são feitas pelo navegador. - Chamadas Ajax são assíncronas e podem ser facilmente integradas a uma lógica de applets.

Pode-se encontrar uma solução elegante integrando as chamadas do Ajax à lógica de um applet, delegando ao navegador a segurança.

0
adicionado

A resposta de Filip não está totalmente correta. Eu corri um programa para farejar os cabeçalhos HTTP em minha estação de trabalho, e o applet Java na verdade apresenta o ticket de autenticação do ASP.NET em algumas circunstâncias - não apenas o suficiente para minhas necessidades.

Eventually I did find a solution to this, but it didn't entirely solve my problem. You can add an entry to the web.config in .NET 2.0: ; but this didn't work for all my users.

A solução de longo prazo acabou modificando o applet Java para que ele não precise recuperar nada do servidor da web.

0
adicionado
JavaScript Brasil OFICIAL
JavaScript Brasil OFICIAL
4 138 dos participantes

Grupo sobre JavaScript do Brasil