Совместное использование файлов cookie сеанса ASP.NET с помощью Java-апплета

StackOverflow https://stackoverflow.com/questions/201699

Вопрос

У меня есть Java-апплет, который работает на странице aspx с проверкой подлинности с помощью форм.В версии моего сайта .NET 1.1 апплет имеет доступ к файлу cookie сеанса и может получить файл с сервера, но в версии .NET 2.0 он не может пройти аутентификацию.

Я видел пару сообщений на форуме в других местах, в которых говорилось, что в версии 2.0 для файлов cookie по умолчанию установлено значение HttpOnly, но предложенные решения пока мне не помогли.Я также где-то читал, что версия 2.0 может быть дискриминационной на основе пользовательского агента.

Есть ли у кого-нибудь опыт или понимание этого?

Это было полезно?

Решение

Этот вопрос старый, но я решил, что было бы полезно получить здесь правильный ответ.

Филип путает серверную Java с клиентской Java.Он прав в том, что вы не можете совместно использовать сеансы между двумя серверными платформами, такими как Java (J2EE) и ASP.Net, без использования специального подхода.

Однако апплеты являются клиентскими и поэтому должны иметь доступ к информации о сеансе главной страницы.Проблема в том, что ASP.Net 2.0 добавил флаг HttpOnly в файлы cookie сеанса.Этот флаг запрещает апплетам JavaScript и Java доступ к этим файлам cookie.

Обходной путь — отключить флаг HttpOnly для файлов cookie сеанса.Хотя вы можете сделать это в конфигурации в более новых версиях 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;
            }
        }
    }
}

Обратите внимание, что даже после этого исправления не все комбинации браузера/ОС/Java могут получить доступ к файлам cookie.В настоящее время я изучаю проблему, связанную с тем, что файлы cookie сеанса недоступны в Firefox 4.0.1 с Java 1.6.0_13 в Windows XP.

Обходной путь — использовать подход Dr.Папа предложил, чтобы идентификатор сеанса передавался апплету в качестве параметра, а затем либо встраивался в URL-адрес запроса (требуется, чтобы сеансы URL-адреса были включены в конфигурации на стороне сервера), либо отправлялся в виде файла cookie, установленного вручную.

Другие советы

Филип одновременно прав и неправ, по крайней мере, в отношении Java и ASP.NET.Апплет может получить доступ к сеансу ASP.NET обманным путем.В моем случае мы добавили идентификатор сеанса в качестве параметра апплета, который затем апплет добавляет в качестве файла cookie в свои запросы.Кажется, работает нормально.(Мы зашифровали идентификатор сеанса, чтобы помешать этим мерзким хакерам!)

Ответ Филиппа не совсем верен.Я запустил программу для анализа заголовков HTTP на своей рабочей станции, и Java-апплет действительно в некоторых случаях предоставляет билет аутентификации ASP.NET — просто недостаточно надежно для моих нужд.

В конце концов я нашел решение этой проблемы, но оно не решило мою проблему полностью.Вы можете добавить запись в web.config в .NET 2.0: <httpCookies httpOnlyCookies="false" />;но это сработало не для всех моих пользователей.

Долгосрочным решением оказалось изменение Java-апплета, чтобы ему не нужно было ничего получать с веб-сервера.

Я знаю, что это может быть очень поздний ответ, но я могу предложить вам более простое решение:- обычно, но не всегда, апплеты активно используют HTML и JavaScript для своих интерфейсов и взаимодействия.- Javascript запускается в браузере.- Вызовы Ajax выполняются браузером.- Вызовы Ajax асинхронны и могут быть легко интегрированы в логику апплета.

Можно найти элегантное решение, интегрирующее вызовы Ajax в логику апплета, делегируя безопасность браузеру.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top