【问题标题】:Using a configured JAAS subject to authenticate a HttpURLConnection?使用配置的 JAAS 主题对 HttpURLConnection 进行身份验证?
【发布时间】:2017-08-15 14:49:42
【问题描述】:

过去有几次,我不得不在 WebSphere Application Server 上运行的应用程序中建立经过身份验证的 HTTP 或 HTTPS 连接。
我通常创建了一些自定义方式来存储连接的用户名和密码 - 使用文本或 XML 文件,或者为了测试,只是硬编码 - 并将这些详细信息添加到 HttpURLConnection 中的 Authorization 标头中,以执行 HTTP Basic身份验证。

我最近认为 WAS 集成解决方案控制台有一种配置用户名和密码的方法(在安全性 -> Java 身份验证和授权服务 -> J2C 身份验证数据下),使用内置功能很有意义(如果可能的话)而不是总是以自定义方式执行此操作,但经过一个小时左右的搜索后,我无法弄清楚如何执行此操作。

那么,有谁知道使用配置的 WAS J2C 身份验证数据对任意 HTTP 或 HTTPS 连接进行身份验证是否可行,如果可行,该怎么做?

我认为它需要 WebSphere API 来:

  • 通过别名检索表示 J2C 身份验证条目的对象;和
  • 执行以下操作之一:
    • 从 JAAS/J2C 对象中获取经过身份验证的 HttpURLConnection 或 HttpsURLConnection 对象;
    • 获取纯文本用户名和密码,以便将它们添加到授权标头;或
    • 如果连接到同一域中的 IBM 平台:从 JAAS/J2C 对象获取 LTPA 令牌,然后可以将其添加到连接中的 cookie。

另外:如果 Apache HttpClient 能让这变得更容易,我可以使用它,但仍然需要适当的 WebSphere API。

我找到了一个可能对 WebSphere Portal 有用的类 (com.ibm.wps.portletservice.credentialvault.credentials.LtpaTokenCredential),但我需要在非 Portal 环境中执行此操作,因此我不能使用任何特定于 Portal 的类或接口。

我还需要它至少在以下类型的应用程序中工作:Servlet 和 WebSphere 信任关联拦截器。

【问题讨论】:

    标签: java authentication servlets websphere jaas


    【解决方案1】:

    我刚刚在 servlet 中尝试了以下 (Modified from here),它成功获取了身份验证别名用户/密码。

    import com.ibm.websphere.security.NotImplementedException;
    import com.ibm.wsspi.security.auth.callback.Constants;
    import com.ibm.wsspi.security.auth.callback.WSMappingCallbackHandlerFactory;
    import javax.resource.spi.security.PasswordCredential;
    import javax.security.auth.Subject;
    import javax.security.auth.callback.CallbackHandler;
    import javax.security.auth.login.LoginContext;
    import javax.security.auth.login.LoginException;
    
    Map map = new HashMap();
    map.put(Constants.MAPPING_ALIAS, "REPLACE_WITH_YOUR_AUTH_ALIAS");
    CallbackHandler callbackHandler = null;
    try {
        callbackHandler = WSMappingCallbackHandlerFactory.getInstance().getCallbackHandler(map, null);
    } catch (NotImplementedException e) {
    }
    
    LoginContext loginContext = null;
    try {
    loginContext = new LoginContext("DefaultPrincipalMapping", callbackHandler);
        loginContext.login();
    } catch (LoginException e) {
    }
    
    Subject subject = loginContext.getSubject();
    Set credentials = subject.getPrivateCredentials();
    
    PasswordCredential passwordCredential = (PasswordCredential) credentials.iterator().next();
    
    String user = passwordCredential.getUserName();
    String password = new String(passwordCredential.getPassword());
    
    response.setContentType("text/html");
    PrintWriter out = response.getWriter();
    out.println("<h1>User: " + user + " --- Password: " + password+"</h1>");
    

    【讨论】:

    • 获取PasswordCredentials 的方法更安全。不是有一个iterator() 方法接受Class 参数吗?
    • 不确定您指的是什么。在 Java 8 之前,Iterator 没有任何接受参数的方法,它只引入了 forEachRemaining,它接受一个 Consumer。
    • 在我有机会亲自测试之前,还需要几天的时间,但它看起来不错。当我能够成功测试它时,我会标记为答案。
    【解决方案2】:

    如果身份验证是在 WAS 服务器之间进行的,则无需进行这些长度;只要参与的 WAS 服务器构成同一安全域的一部分并相互信任,LTPA 令牌就足够了。

    如果您的想法是从非 WAS 服务器转到 WAS 服务器,您可以查看 TAI 选项,但您仍然不需要使用身份验证别名。

    当我们从一个服务向下游服务进行身份验证时,我们只需传入 LTPA 令牌,如下所示(LTPA 令牌不是 Portal 事物,它是 WAS 事物)。假设某人已经在您的服务上进行了身份验证,例如从 Portal 或 WAS 登录,我们想在另一个 WAS 服务器上调用下游 REST 服务。

    /** For call to a REST client, use apache wink that comes with WAS:
    * This method shows how to pass in the available LTPA token to create
    * a RestClient
    private org.apache.wink.client.RestClient getRestClient() {
      if (restClient == null) {
        org.apache.wink.client.ClientConfig config = new ClientConfig();    
        config.handlers(new org.apache.wink.client.handlers.LtpaAuthSecurityHandler());
        restClient = new RestClient(config);
      }
      return restClient;
    }
    

    【讨论】:

    • 我有一个特殊情况,我需要在任何用户通过身份验证之前调用需要管理员访问权限(用于创建 Connections 用户配置文件)的 IBM Connections REST API。我确信那时不会有任何 LTPA 令牌。
    • 100%;然后它将系统用户的凭据存储为身份验证别名,按照描述获取它并使用您的 REST 客户端添加 BASIC auth 标头。
    猜你喜欢
    • 2021-07-21
    • 2014-01-30
    • 2023-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-09
    相关资源
    最近更新 更多