Session 身份验证为匿名的用户试图访问拥有的会话

Session 身份验证为匿名的用户试图访问拥有的会话,session,jakarta-ee,websphere-8,ltpa,Session,Jakarta Ee,Websphere 8,Ltpa,在登录之前,我可以访问安全约束目录之外的任何内容。如果我试图转到安全约束目录中的某个位置,它会将我重定向到表单登录页面。如你所料 一旦登录,我就可以继续我的业务,并访问安全约束内外的资源 但是,当LTPA令牌过期(仍然有一个活动会话)并且我尝试转到一个不受限制的页面时,比如说像被重定向到登录页面一样,我在标题中得到了错误 所以我想弄清楚几件事: 1.我可以让LTPA令牌不象我的会话那样过期吗? 2.当LTPA令牌过期时,我可以使会话过期吗? 3.为什么我不能匿名访问不受限制的页面?它清楚地认识到

在登录之前,我可以访问安全约束目录之外的任何内容。如果我试图转到安全约束目录中的某个位置,它会将我重定向到表单登录页面。如你所料

一旦登录,我就可以继续我的业务,并访问安全约束内外的资源

但是,当LTPA令牌过期(仍然有一个活动会话)并且我尝试转到一个不受限制的页面时,比如说像被重定向到登录页面一样,我在标题中得到了错误

所以我想弄清楚几件事: 1.我可以让LTPA令牌不象我的会话那样过期吗? 2.当LTPA令牌过期时,我可以使会话过期吗? 3.为什么我不能匿名访问不受限制的页面?它清楚地认识到我的LTPA令牌已过期,并试图将我重定向到登录。在这一点上,它失败了

好的,那就找个有过滤器的地方。筛选器将未登录的用户重定向到登录页面。但是问题再次出现,只要ltpa令牌过期,这一行就会失败
((HttpServletRequest)请求)。getSession(false)
在标题中抛出异常,
UnauthorizedSessionRequestException
。如你所见,我试图捕捉错误并注销。woops,这会引发另一个
未经授权的SessionRequestException
。那么,我如何才能不使用该会话呢

@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);
}
我可以让LTPA令牌不象我的会话一样过期吗?

不幸的是,没有。LTPA令牌具有固定超时,会话具有非活动超时。如果需要,可以将LTPA令牌超时时间延长到8小时,以避免过期

为什么我不能匿名访问不受限制的页面?

因为它尝试访问以前与已验证用户关联的会话。通过禁用
Servers>Server Types>websphereapplicationservers>Server\u name>sessionmanagement
中的
securityintegration
设置,您可以允许匿名访问会话

您还可以检查在访问未受保护的URI时
是否使用可用的身份验证数据
Security>Global Security>authentication>Web和SIP Security>General settings
中启用了

它清楚地意识到我的LTPA令牌已过期,并试图将我重定向到登录。此时它会失败。

尝试在登录页面上禁用会话支持,如果是jsp,则尝试在页面中设置

更新

因此,如果您想预防性地检查LTPA过期,可以根据令牌过期之前的注销用户检查LTPA过期,例如5分钟之前。当然,如果用户在这5分钟内处于非活动状态,您仍然会得到该异常,但对于90%的情况,它应该足够了

要获取令牌的到期时间,请使用以下代码(伪代码):

WSSubject-subject=WSSubject.getRunAsSubject();
设置凭据=subject.getPublicCredentials(WSCredential.class);
用于(WSCredential凭据:凭据){
//在大多数情况下,您只能找到一个凭证,但如果您
//要确保您可以检查凭据OID吗
System.out.println(“Exp-date:+新日期(credential.getExpiration()));
System.out.println(“用户名:”+credential.getSecurityName());
System.out.println(“cred:+credential.getOID());
//如果过期日期比您的阈值近-注销用户
// ... 
}
身份验证机制的OID
BasicAuth(GSSUP):oid:2.23.130.1.1
KRB5:OID:1.2.840.113554.1.2.2
LTPA:oid:1.3.18.0.2.30.2
更新2

好的,我为你找到了更好的解决方案

只需在会话管理器中设置以下标志:

InvalidateOnUnauthorizedSessionRequestException=true

InvalidateOnUnauthorizedSessionRequestException

如果响应未经授权的请求, 您希望会话管理器使会话无效,而不是 发出UnauthorizedSessionRequestException错误消息

当会话无效时,请求者可以创建一个新会话, 但无权访问以前保存的任何会话数据。 此失效允许单个用户继续处理请求 注销后,仍在保护会话数据


有关Webshepre 8.5,请参见此处的详细信息。转到服务器>服务器类型>WebSphere应用程序服务器>服务器名称(server1)>会话管理。(查看右侧菜单) 自定义属性->添加新属性

Name =InvalidateOnUnauthorizedSessionRequestException
Value=true.
保存它并在eclipse中重新启动服务器。
在SOAPUI中测试webservice时,我遇到了这个问题。

这个jsf是如何相关的?你的问题与itIt的JSF应用程序没有任何关系,我认为这是相关信息。如果它与问题相关,那么它是相关的。你还可以加上“爪哇”、“能源”、“全球变暖”(由燃烧运行爪哇所需能源的化石燃料引起;-)。请删除它,我不同意。JSF意味着“java”、“能源”、“全球变暖”(由燃烧运行java所需的化石燃料引起;-)。Websphere-8和LTPA并不意味着我们试图在看到错误的平台上运行什么类型的应用程序。关键是,您的帖子中没有任何内容指出这个问题与jsf相关,甚至没有一行jsf代码。使用jsf并不是添加该标记的有效理由。这就是为什么我提到java(您也在使用它,但该标记更无效)、energy(您正在使用它吗?)。用一个简单的jsp来实现它会失败吗?请阅读标签1。我希望有一种方法可以通过编程重新生成LTPA令牌,而无需用户重新登录。而且,使用其他业务应用程序延长集群上的超时时间会很麻烦。2.我宁愿不去
Name =InvalidateOnUnauthorizedSessionRequestException
Value=true.