0

在我们的 Web 应用程序中,我们需要在成功登录后将身份验证令牌 (LtpaToken2 (websphere)、JSESSIONID(tomcat)) 存储在外部数据存储中。我希望在登录 HttpServletRequest 对象后检索令牌。

        LOG.debug("nr of cookies in request " + request.getCookies().length + " response header " + response.getHeaderNames().size());
        request.login(employee.getUsername(), employee.getPassword());
        URI uri = info.getBaseUri().resolve("/login2");
        LOG.debug("new uri is: '"+ uri + "' nr of cookies in request " + request.getCookies().length + " response header " + response.getHeaderNames().size());
        // Add the Higgs Cookie

日志输出表明 cookie 和标头的数量不变。是否有另一种方法可以在登录完成的同一请求中检索身份验证令牌,最好独立于平台?我可能可以进行重定向并从下一个请求中读取令牌,但我担心这会带来一些额外的安全威胁。

4

1 回答 1

2

有什么理由要存储该 cookie?由于它在特定超时后发生变化,因此存储它不会提供太多价值。下面的代码可用于从请求中访问它。

身份验证令牌是 cookie 而不是标头。您必须使用以下代码访问它(此代码在成功验证后的任何页面中都有效):

Cookie cookies[] = request.getCookies();
for(Cookie c : cookies){
    if("LtpaToken2".equals(c.getName())) {
        // do something with ltpa cookie
        out.println(c.getName() + " : " + c.getValue());
    }
}

更新
要在执行登录的 servlet 中获取令牌,请使用以下代码:

Set<Object> credentials = WSSubject.getRunAsSubject().getPrivateCredentials();
for (Object credential : credentials) {
    if(credential instanceof SingleSignonToken) {
        SingleSignonToken token = (SingleSignonToken)credential;
        System.out.println(token.getName());
        System.out.println(token.getUniqueID());
        System.out.println(token.getPrincipal());
        System.out.println("LTPA Token encoded: " + Base64.encode(token.getBytes()));
    }
}
于 2015-06-05T14:15:55.537 回答