Пользователь, прошедший проверку подлинности как анонимный, попытался получить доступ к сеансу, принадлежащему

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

После входа в систему я могу заниматься своими делами и использовать ресурсы как снаружи, так и внутри моего ограничения безопасности.

Но когда срок действия токена LTPA истекает (все еще есть активная сессия) и я пытаюсь перейти на неограниченную страницу, например, меня перенаправляют на страницу входа, я получаю сообщение об ошибке в заголовке.

Итак, я хотел бы выяснить несколько вещей: 1. Могу ли я сделать так, чтобы токен LTPA не истекал, как моя сессия? 2. Могу ли я истечь свою сессию, когда истечет токен LTPA? 3. Почему я не могу анонимно зайти на неограниченную страницу? Он четко распознает, что срок действия моего токена LTPA истек, и пытается перенаправить меня для входа в систему. В какой момент это терпит неудачу.

ОК, значит попал куда-то с фильтром. Фильтр перенаправляет пользователя, не вошедшего в систему, на страницу входа. Но проблема снова в том, что как только срок действия токена ltpa истекает, эта строка перестает работать ((HttpServletRequest) request).getSession(false), вызывая исключение в заголовке, UnauthorizedSessionRequestException. Итак, как вы можете видеть, я попытался поймать эту ошибку и выйти из системы. Который, упс, бросает еще UnauthorizedSessionRequestException. Так как же мне не использовать сеанс?

@Override
public void doFilter(final ServletRequest request, final ServletResponse response,
    final FilterChain chain) throws IOException, ServletException
{
    final String sourceMethod = "doFilter";
    if (logger.isLoggable(Level.FINER)) {
        logger.entering(sourceClass, sourceMethod, new Object[] { request, response, chain });
    }

    try {
        final HttpSession session = ((HttpServletRequest) request).getSession(false);
        final UserBean user = (session != null) ? (UserBean) session.getAttribute("userBean")
            : null;
        if (user == null || (user != null && !user.isLoggedOn())) {
            final HttpServletResponse res = (HttpServletResponse) response;
            res.sendRedirect("../login.jsf");
        } 
    } catch (final UnauthorizedSessionRequestException exc) {
        ((HttpServletRequest) request).logout();
        final HttpServletResponse res = (HttpServletResponse) response;
        res.sendRedirect("../login.jsf");
    } catch (final Exception exc) {
        final ServletException exception = new ServletException(
            "[UserBeanFilter] Exception doFilter.", exc);
        logger.throwing(sourceClass, sourceMethod, exception);
        throw exception;
    }
    chain.doFilter(request, response);
    logger.exiting(sourceClass, sourceMethod);
}

person Justin Brew    schedule 20.10.2015    source источник
comment
Как это связано с jsf? Ваш вопрос не имеет к этому никакого отношения   -  person Kukeltje    schedule 21.10.2015
comment
Это приложение JSF, я подумал, что это актуальная информация.   -  person Justin Brew    schedule 21.10.2015
comment
Уместно, если это имеет отношение к проблеме. Вы также можете добавить «java», «энергия», «глобальное потепление» (вызванное сжиганием ископаемого топлива, необходимого для энергии, необходимой для запуска Java ;-)). Пожалуйста, удалите это   -  person Kukeltje    schedule 21.10.2015
comment
Я не согласен. JSF подразумевает «java», «энергию», «глобальное потепление» (вызванное сжиганием ископаемого топлива, необходимого для энергии, необходимой для запуска java ;-)). Websphere-8 и LTPA не подразумевают, какой тип приложения мы пытаемся запустить на той платформе, на которой видим ошибку.   -  person Justin Brew    schedule 21.10.2015
comment
Я немного преувеличил. Дело в том, что ничто в вашем сообщении не указывает на то, что эта проблема связана с jsf, даже ни одной строки кода jsf. Тот факт, что вы используете jsf, не является веской причиной для добавления этого тега. Вот почему я упомянул java (вы тоже используете это, но этот тег еще более недействителен), энергию (вы используете это правильно?). Это не удается с простым jsp? Пожалуйста, прочитайте Как спросить о тегах   -  person Kukeltje    schedule 21.10.2015
comment
Благодарю за ваш ответ. Я искал, как пометить, и нашел это. Попробуйте включить тег для языка, библиотеки и конкретного API, к которому относится ваш вопрос. Вероятно, это может быть основной причиной того, как JSF обрабатывает сеансы. Так как в нем всегда создается сессия. В отличие от JSP, который, по-видимому, из ответа Гаса, я мог бы сделать что-то вроде ‹@page session=false›   -  person Justin Brew    schedule 21.10.2015
comment
JSF не является фреймворком безопасности. Это фреймворк MVC.   -  person BalusC    schedule 21.10.2015
comment
@BalusC Я думаю, что это немного то, как JSF обрабатывает сеансы / безопасность. И нельзя сказать, что JSF не имеет ничего общего с безопасностью. Удаление JSF и установка java-ee могут дать мне неправильный ответ. Как будто кто-то говорит мне, как справиться с этой проблемой в JSP, что мне не поможет.   -  person Justin Brew    schedule 21.10.2015
comment
Сеансы управляются не JSF, а контейнером Java EE (в вашем случае Websphere). Там нет тега [jsp], так что вы в безопасности;)   -  person BalusC    schedule 22.10.2015
comment
@BalusC да, сеанс управляется контейнером, но не каждая ли страница JSF обращается к сеансу? Я получаю ту же ошибку на простой xhtml-странице Hello World. Это не просто что-то странное, что я делаю на странице входа. Теперь видите проблему? Я не могу попасть на свою страницу входа, потому что она использует сеанс и выдает мне сообщение об ошибке, говорящее, что я пытаюсь использовать свой старый сеанс, разве это не проблема в какой-то части JSF? И поэтому может быть какое-то решение в JSF. Помимо того, что IBM говорит мне сделать, это отключить интеграцию безопасности, что означает, что анонимный доступ к сеансу в порядке...   -  person Justin Brew    schedule 22.10.2015
comment
У вас была бы точно такая же проблема с любой другой инфраструктурой MVC, использующей тот же механизм аутентификации, даже с простым JSP. Ничто из этого не связано с каким-либо классом пакета javax.faces.*. Итак, проблема не в JSF.   -  person BalusC    schedule 22.10.2015
comment
@BalusC Но я использую JSF, и хотя это не проблема, специфичная для JSF, может быть решение, специфичное для JSF. Что касается JSP, Gas, похоже, считает, что добавление тега в JSP может обойти эту проблему. А для JSF может быть это? stackoverflow.com/questions/4095713/. В этом вся моя суть. Но нет, вы не хотите, чтобы это было в теге. Ладно, я закончил спорить. Тег был удален, и Гас был гораздо полезнее, чем вы или Кукельтье, возившиеся над тегом.   -  person Justin Brew    schedule 22.10.2015
comment
Аутентификация выполняется перед запуском JSF. Я не заморачивался из-за тега, а ты.   -  person BalusC    schedule 22.10.2015
comment
Вы же не заморачивались, а просто убрали это из моего поста. Спасибо!   -  person Justin Brew    schedule 22.10.2015


Ответы (2)


Могу ли я сделать так, чтобы срок действия токена LTPA не истекал, как у моего сеанса?

К сожалению нет. Токен LTPA имеет фиксированный тайм-аут, а сеанс имеет тайм-аут бездействия. Если вам нужно, вы можете увеличить время ожидания токена LTPA, например, до 8 часов, чтобы избежать истечения срока действия.

Почему я не могу анонимно перейти на неограниченную страницу?

Потому что он пытается получить доступ к сеансу, который ранее был связан с аутентифицированным пользователем. Вы можете разрешить анонимный доступ к сеансу, отключив настройку Security integration в Servers > Server Types > WebSphere application servers > server_name > Session management.

Вы также можете проверить, включен ли Use available authentication data when an unprotected URI is accessed в Security > Global security > Authentication > Web and SIP security > General settings.

Он четко распознает, что срок действия моего токена LTPA истек, и пытается перенаправить меня для входа в систему. В этот момент происходит сбой.

Попробуйте отключить поддержку сеанса на странице входа в систему, если это jsp, попробуйте установить <@page session="false"> на странице.

ОБНОВЛЕНИЕ

Поэтому, если вы хотите быть превентивным, вы можете проверить срок действия LTPA и на основе этого пользователя выйти из системы до истечения срока действия токена, например, за 5 минут до этого. Конечно, если пользователь будет неактивен в течение этих 5 минут, вы все равно получите это исключение, но этого должно быть достаточно для 90% случаев.

Чтобы получить срок действия токена, используйте следующий код (псевдокод):

WSSubject subject = WSSubject.getRunAsSubject();
Set<WSCredential> credentials = subject.getPublicCredentials(WSCredential.class);

for(WSCredential credential : credentials) {
     // in the most cases you will find only one credential, but if you 
     // want to be sure you can check credential OID
        System.out.println("Exp date:" + new Date(credential.getExpiration()));
        System.out.println("userName: " + credential.getSecurityName());
        System.out.println("cred: " + credential.getOID());

        // if expiration date closer than your threshold - logout user
        // ... 

}



OIDs for auth mechanisms

BasicAuth (GSSUP):  oid:2.23.130.1.1.1
KRB5: OID: 1.2.840.113554.1.2.2
LTPA:    oid:1.3.18.0.2.30.2 

ОБНОВЛЕНИЕ 2

Хорошо, я нашел более приятное решение для вас.

Просто установите следующий флаг в диспетчере сеансов:

InvalidateOnUnauthorizedSessionRequestException=true

InvalidateOnUnauthorizedSessionRequestException

Установите для этого свойства значение true, если в ответ на неавторизованный запрос вы хотите, чтобы диспетчер сеансов аннулировал сеанс, а не выдавал сообщение об ошибке UnauthorizedSessionRequestException.

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

Подробнее см. здесь " rel="nofollow noreferrer">Пользовательские свойства управления сеансом

person Gas    schedule 21.10.2015
comment
1. Я надеялся, что есть способ программно регенерировать токен LTPA без повторного входа пользователя в систему. И увеличение времени ожидания в кластере с другими бизнес-приложениями будет проблематичным. 2. Я бы не хотел открывать анонимный доступ к сессиям. И второй вариант включен. Если отключено, я получаю сообщение SECJ0369E: Ошибка аутентификации при использовании LTPA. Исключением является com.ibm.websphere.wim.exception.WIMException. Я предполагаю, что сообщение на странице входа больше не получает информацию для аутентификации. 3. Я использую JSF 2.2. Я не нахожу такой вариант, который эквивалентен. - person Justin Brew; 21.10.2015
comment
Кроме того, спасибо за ваш ответ. Я также попытался добавить фильтр на сайт, который сделал бы недействительным сеанс на странице входа. Но похоже, что фильтр не вызывается, прежде чем я получаю сообщение об ошибке. - person Justin Brew; 21.10.2015
comment
Я попробовал еще немного с фильтром и зашел в тупик. Смотрите обновленный исходный пост. - person Justin Brew; 21.10.2015
comment
Последний вариант отлично работает. Я также обнаружил, что в наших средах отключена интеграция безопасности. Итак, что происходит, мои журналы заполняются тысячами предупреждений об истечении срока действия токена LTPA. Чтобы противостоять этому, я мог бы просто иметь вход в систему с фильтром, если тип авторизации равен нулю. Но это означало бы необходимость сохранять имя пользователя и пароль в сеансе... Все это было бы исправлено, если бы IBM рассматривала тайм-аут LTPA как тайм-аут сеанса, основанный на последнем доступе. - person Justin Brew; 22.10.2015
comment
Ссылка не работает. Проверьте: ibm.com/support/knowledgecenter/en/SSAW57_8.0.0/ - person Chinmoy; 01.01.2018

Для Вебшепре 8.5. Перейдите в раздел Серверы > Типы серверов > Серверы приложений WebSphere > имя_сервера (сервер1) > Управление сеансом (смотрите в меню справа) Пользовательские свойства -> Добавить новые свойства

Name =InvalidateOnUnauthorizedSessionRequestException
Value=true.

Сохраните его и перезапустите сервер в eclipse. Я столкнулся с этой проблемой при тестировании веб-сервиса в SOAPUI.

person Chinmoy    schedule 01.01.2018