身份验证为匿名的用户已尝试访问 session 拥有的
A user authenticated as anonymous has attempted to access a session owned
在登录之前,我可以点击安全约束目录之外的任何内容。如果我尝试转到安全约束目录内的某个位置,它会将我重定向到表单登录页面。如您所料。
登录后,我可以处理我的业务,访问我的安全约束内外的资源。
但是,当 LTPA 令牌过期(仍然有一个活动的 session)并且我尝试转到不受限制的页面时,假设被重定向到登录页面,我在标题中得到错误.
所以我想弄清楚一些事情:
1. 我可以让 LTPA 令牌像我的 session 一样不会过期吗?
2. 我的 session 可以在 LTPA 令牌过期时过期吗?
3、为什么我不能匿名访问不受限制的页面?它清楚地认识到我的 LTPA 令牌已过期并尝试重定向我以进行登录。在这一点上它失败了。
好的,所以找到了带过滤器的地方。过滤器将未登录的人重定向到登录页面。但问题又是,一旦 ltpa 令牌过期,此行就会失败 ((HttpServletRequest) request).getSession(false)
,并在标题 UnauthorizedSessionRequestException
中抛出异常。因此,正如您所见,我试图捕获该错误并注销。哪一个,哎呀,抛出另一个 UnauthorizedSessionRequestException
。那我怎么不使用 session?
@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 > WebSphere application servers > server_name > Session management
.
中的 Security integration
设置来允许匿名访问会话
您还可以检查 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
Set this property to true if, in response to an unauthorized request,
you want the session manager to invalidate a session instead of
issuing an UnauthorizedSessionRequestException error message.
When a session is invalidated, the requester can create a new session,
but does not have access to any of the previously saved session data.
This invalidation allows a single user to continue processing requests
after a logout while still protecting session data.
在此处查看详细信息Session management custom properties
适用于 Webshepre 8.5。转到服务器 > 服务器类型 > WebSphere 应用程序服务器 > server_name(server1) > 会话管理。(查看右侧菜单)
自定义属性 -> 添加新属性
Name =InvalidateOnUnauthorizedSessionRequestException
Value=true.
保存并在eclipse中重启服务器。
我在 SOAPUI 中测试 Web 服务时遇到了这个问题。
在登录之前,我可以点击安全约束目录之外的任何内容。如果我尝试转到安全约束目录内的某个位置,它会将我重定向到表单登录页面。如您所料。
登录后,我可以处理我的业务,访问我的安全约束内外的资源。
但是,当 LTPA 令牌过期(仍然有一个活动的 session)并且我尝试转到不受限制的页面时,假设被重定向到登录页面,我在标题中得到错误.
所以我想弄清楚一些事情: 1. 我可以让 LTPA 令牌像我的 session 一样不会过期吗? 2. 我的 session 可以在 LTPA 令牌过期时过期吗? 3、为什么我不能匿名访问不受限制的页面?它清楚地认识到我的 LTPA 令牌已过期并尝试重定向我以进行登录。在这一点上它失败了。
好的,所以找到了带过滤器的地方。过滤器将未登录的人重定向到登录页面。但问题又是,一旦 ltpa 令牌过期,此行就会失败 ((HttpServletRequest) request).getSession(false)
,并在标题 UnauthorizedSessionRequestException
中抛出异常。因此,正如您所见,我试图捕获该错误并注销。哪一个,哎呀,抛出另一个 UnauthorizedSessionRequestException
。那我怎么不使用 session?
@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 > WebSphere application servers > server_name > Session management
.
Security integration
设置来允许匿名访问会话
您还可以检查 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
Set this property to true if, in response to an unauthorized request, you want the session manager to invalidate a session instead of issuing an UnauthorizedSessionRequestException error message.
When a session is invalidated, the requester can create a new session, but does not have access to any of the previously saved session data. This invalidation allows a single user to continue processing requests after a logout while still protecting session data.
在此处查看详细信息Session management custom properties
适用于 Webshepre 8.5。转到服务器 > 服务器类型 > WebSphere 应用程序服务器 > server_name(server1) > 会话管理。(查看右侧菜单) 自定义属性 -> 添加新属性
Name =InvalidateOnUnauthorizedSessionRequestException
Value=true.
保存并在eclipse中重启服务器。 我在 SOAPUI 中测试 Web 服务时遇到了这个问题。