SSO при потере сеанса websphere

#session #cookies #websphere #single-sign-on

#сеанс #файлы cookie #websphere #единый вход

Вопрос:

У меня следующая настройка: запрос поступает через балансировщик нагрузки на сервер Websphere IHS, который пересылает запрос на сервер приложений, также Websphere. Проблема, с которой я сталкиваюсь при включении единого входа, заключается в том, что при каждом запросе создается новый сеанс.

Я знаю это, потому что я написал сервлет отслеживания, и идентификатор сеанса отличается для каждого запроса. Веб-сервер и сервер приложений настроены для работы с файлами cookie, а в балансировщике нагрузки включены сеансы с привязкой.

Я использую spenego, поскольку это websphere и kerberos config для проверки пользователя из Active Directory.

У кого-нибудь есть какие-либо идеи / указания относительно того, почему мой сеанс создается при каждом запросе только тогда, когда включен единый вход. Без единого входа сеанс одинаков для разных запросов. Я перепробовал много разных настроек в websphere, но ни одна из них не работала. например, кластеризация на уровне сервера, включение флажка безопасности в websphere session management и т. Д..

Я также попытался создать свой собственный файл cookie и поместить его обратно в ответ, думая, что он вернется в запросе, но, как и раньше, файл cookie не отправляется обратно. Файл cookie JSessionID также не отображается. Также при создании моего собственного файла cookie, как вы можете видеть в журналах, в нем указано, что com.ibm.ws.webcontainer.srt.SRTServletResponse addCookie ПРЕДУПРЕЖДЕНИЕ: не удается установить заголовок. Ответ уже зафиксирован.

Если вам нужна дополнительная информация, пожалуйста, спросите, и я буду рад предоставить

тогда исправьте детали:

В моем сервлете есть следующий код для проверки информации о сеансе и создания собственного файла cookie

  //lets try setting a cookie into the response
                System.out.println("Setting a new cookie into the session");
                String user = "";
                if(req.getAttribute("com.ibm.ws.security.spnego.UserPrincipal") != null) {
                    user = req.getAttribute("com.ibm.ws.security.spnego.UserPrincipal").toString();
                    Cookie userCookie = new Cookie("userId", user);
                    userCookie.setMaxAge(60*60*24*365); //Store cookie for 1 year
                    res.addCookie(userCookie);
                }


                HttpSession session = req.getSession(false);
                if ( session != null )
                {
                        out.println("<h2>Session information:</h2>");
                        out.println("<TABLE Border="2" WIDTH="65%" BGCOLOR="#DDDDFF">");
                        print(out, "Session ID", session.getId());
                        print(out, "Last accessed time", new Date(session.getLastAccessedTime()).toString());
                        print(out, "Creation time", new Date(session.getCreationTime()).toString());
                        String mechanism = "unknown";
                        if ( req.isRequestedSessionIdFromCookie() )
                        {
                                mechanism = "cookie";
                        }
                        else if ( req.isRequestedSessionIdFromURL() )
                        {
                                mechanism = "url-encoding";
                        }
                        print(out, "Session-tracking mechanism", mechanism);
                        out.println("</table><BR><BR>");

                        Enumeration vals = session.getAttributeNames();
                        if (vals.hasMoreElements())
                        {
                                out.println("<h2>Session values</h2>");
                                out.println("<TABLE Border="2" WIDTH="65%" BGCOLOR="#DDDDFF">");

                                while (vals.hasMoreElements())
                                {
                                        String name = (String)vals.nextElement();
                                        out.println("<tr><td>"   escapeChar(name)   "</td><td>"   escapeChar(session.getAttribute(name).toString())   "</td></tr>");
                                }
                                out.println("</table><BR><BR>");
                        }
                }

                out.println("</body></html>");
        }
  

И следующий код для проверки файлов cookie в запросе

  Cookie[] cookies = req.getCookies();
                if ( cookies != null amp;amp; cookies.length > 0 )
                {
                        out.println("<H2>Client cookies</H2>");
                        out.println("<TABLE Border="2" WIDTH="65%" BGCOLOR="#DDDDFF">");
                        for ( int i=0; i<cookies.length; i   )
                        {
                                out.println("<tr><td>"   escapeChar(cookies[i].getName())   "</td><td>"   escapeChar(cookies[i].getValue())   "</td></tr>");
                        }
                        out.println("</table><BR><BR>");
                }
  

and the following checks the request attributes

   e = req.getAttributeNames();
                if ( e.hasMoreElements() )
                {
                        out.println("<h2>Request attributes:</h2>");
                        out.println("<TABLE Border="2" WIDTH="65%" BGCOLOR="#DDDDFF">");
                        while ( e.hasMoreElements() )
                        {
                                String name = (String)e.nextElement();
                                System.out.println("Reuqest Attribute Faisal**************"   name   "********"   req.getAttribute(name).toString());
                                if(req.getSession() != null) {
                                    System.out.println("**************Session id = "   req.getSession().getId());
                                } else {
                                    System.out.println("**************Session is null");
                                }

                                if(req.getAttribute("com.ibm.ws.security.spnego.UserPrincipal") != null) {
                                    if(req.getSession(false) != null) {
                                        System.out.println("****Got the old Session id Faisal = "   req.getSession().getId());
                                        req.getSession().setAttribute("user.principal", req.getAttribute("com.ibm.ws.security.spnego.UserPrincipal"));
                                    }
                                }
                out.println("<tr><td>"   escapeChar(name)   "</td><td>"   escapeChar(req.getAttribute(name).toString())   "</td></tr>");
                        }
                        out.println("</table><BR><BR>");
                }
  

Итак, при первой отправке запроса все мои переменные сеанса и атрибуты запроса распечатываются, при второй отправке запроса пользователь-участник недоступен, и мои журналы выглядят следующим образом

    [6/18/14 9:33:17:445 BST] 0000002f SystemOut     O Reuqest Attribute**************javax.servl
et.request.key_size********128
[6/18/14 9:33:17:445 BST] 0000002f WASSessionCor W SessionAffinityManager setCookie SESN0066E: The r
esponse is already committed to the client. The session cookie cannot be set.
[6/18/14 9:33:17:447 BST] 0000002f srt           W com.ibm.ws.webcontainer.srt.SRTServletResponse ad
dSessionCookie WARNING: Cannot set session cookie. Response already committed.
[6/18/14 9:33:17:448 BST] 0000002f SystemOut     O **************Session id = N0Lp9cftRNzWkjw
KUDheA1U
[6/18/14 9:33:17:448 BST] 0000002f SystemOut     O ****Got the old Session id = N0Lp9cftRNzWk
jwKUDheA1U
[6/18/14 9:33:17:448 BST] 0000002f SystemOut     O Reuqest Attribute**************javax.servl
et.request.cipher_suite********RC4-SHA
[6/18/14 9:33:17:449 BST] 0000002f SystemOut     O **************Session id = N0Lp9cftRNzWkjw
KUDheA1U
[6/18/14 9:33:17:449 BST] 0000002f SystemOut     O ****Got the old Session id= N0Lp9cftRNzWk
jwKUDheA1U
[6/18/14 9:33:17:449 BST] 0000002f SystemOut     O Reuqest Attribute**************com.ibm.ws.
security.spnego.UserPrincipal********user@domain.COM
[6/18/14 9:33:17:449 BST] 0000002f SystemOut     O **************Session id = N0Lp9cftRNzWkjw
KUDheA1U
[6/18/14 9:33:17:449 BST] 0000002f SystemOut     O ****Got the old Session id = N0Lp9cftRNzWk
jwKUDheA1U
[6/18/14 9:33:17:449 BST] 0000002f SystemOut     O Reuqest Attribute**************com.ibm.web
sphere.servlet.uri_non_decoded********/lbgssoclient/snoop/
[6/18/14 9:33:17:449 BST] 0000002f SystemOut     O **************Session id = N0Lp9cftRNzWkjw
KUDheA1U
[6/18/14 9:33:17:450 BST] 0000002f SystemOut     O ****Got the old Session id= N0Lp9cftRNzWk
jwKUDheA1U
[6/18/14 9:33:17:452 BST] 0000002f SystemOut     O Setting a new cookie into the session
[6/18/14 9:33:17:452 BST] 0000002f srt           W com.ibm.ws.webcontainer.srt.SRTServletResponse ad
dCookie WARNING: Cannot set header. Response already committed.
[6/18/14 9:35:01:745 BST] 0000002e SystemOut     O Reuqest Attribute**************javax.servl
et.request.key_size********128
[6/18/14 9:35:01:746 BST] 0000002e WASSessionCor W SessionAffinityManager setCookie SESN0066E: The r
esponse is already committed to the client. The session cookie cannot be set.
[6/18/14 9:35:01:747 BST] 0000002e srt           W com.ibm.ws.webcontainer.srt.SRTServletResponse ad
dSessionCookie WARNING: Cannot set session cookie. Response already committed.
[6/18/14 9:35:01:749 BST] 0000002e SystemOut     O **************Session id = ChRGK9SP4lEnGc2
yy7WQdGb
[6/18/14 9:35:01:750 BST] 0000002e SystemOut     O Reuqest Attribute**************javax.servl
et.request.cipher_suite********RC4-SHA
[6/18/14 9:35:01:750 BST] 0000002e SystemOut     O **************Session id = ChRGK9SP4lEnGc2
yy7WQdGb
[6/18/14 9:35:01:750 BST] 0000002e SystemOut     O Reuqest Attribute**************com.ibm.web
sphere.servlet.uri_non_decoded********/lbgssoclient/snoop/
[6/18/14 9:35:01:750 BST] 0000002e SystemOut     O **************Session id Faisal = ChRGK9SP4lEnGc2
yy7WQdGb
[6/18/14 9:35:01:752 BST] 0000002e SystemOut     O Setting a new cookie into the session
  

Приветствуются любые советы или указания. я знаю, что здесь много информации, но я действительно борюсь с этим.

Спасибо

Обновить:

После добавления session listner для мониторинга сеанса я заметил в журналах следующее

 [6/18/14 12:45:40:880 BST] 00000025 ServerCache   I   DYNA1071I: The cache provider "default" is being used.
[6/18/14 12:45:40:937 BST] 00000025 SystemOut     O getting session for attributes print out
[6/18/14 12:45:40:938 BST] 00000025 SystemOut     O Reuqest Attribute **************javax.servlet.request.key_size********128
[6/18/14 12:45:40:941 BST] 00000025 SystemOut     O sessioncreated
[6/18/14 12:45:40:941 BST] 00000025 SystemOut     O 1403091940939
[6/18/14 12:45:40:942 BST] 00000025 SystemOut     O oN74OFyuPHcnyoxO_YBLK7z
[6/18/14 12:45:40:942 BST] 00000025 SystemOut     O 1403091940939
[6/18/14 12:45:40:943 BST] 00000025 SystemOut     O 1800
[6/18/14 12:45:40:943 BST] 00000025 SystemOut     O sessionCreated - add one session into counter
[6/18/14 12:45:40:944 BST] 00000025 WASSessionCor W SessionAffinityManager setCookie SESN0066E: The response is already committed to the client. The session cookie cannot be set.
[6/18/14 12:45:40:945 BST] 00000025 srt           W com.ibm.ws.webcontainer.srt.SRTServletResponse addSessionCookie WARNING: Cannot set session cookie
. Response already committed.
  

в последних нескольких строках указано, что невозможно установить файл cookie сеанса, поскольку ответ уже зафиксирован. Кто-нибудь знает, как это решить?

Комментарии:

1. Я никогда не видел такого поведения. Возможно, ваш браузер или что-то в этом роде удаляет файлы cookie. После успешной аутентификации у вас должен быть файл cookie JSESSIONID и файл cookie LtpaToken2, независимо от того, используете ли вы SPNEGO или нет. Возможно, ваше доменное имя в конфигурации единого входа неверно.

2. Я посмотрю на доменное имя. Спасибо. Пожалуйста, ознакомьтесь с моим обновлением после добавления прослушивателя сеанса.

3. Что касается файлов cookie, сначала вам нужно добавить / изменить файлы cookie в ответе, затем получить writer и распечатать его, в противном случае у вас будет сообщение об уже зафиксированном ответе.

4. Мне удалось решить проблему с сеансом для каждого запроса, переместив вызов req.getsession() в первую строку кода. Однако я не совсем понимаю, как это было проблемой