1

我们正在构建具有两步身份验证过程的 Worklight 应用程序。

第 1 步:表单身份验证
我们正在使用开箱即用的 WASLTPARealm,它根据 WebSphere 中的自定义 JAAS 模块对我们进行身份验证并返回一个 LTPA 令牌。这按预期工作。

第 2 步:自定义身份验证
器 第二步是自定义身份验证器和登录模块,它:

  • 读取在步骤 1 中设置的 LTPA cookie
  • 使用 LTPA cookie 向另一个应用程序发出 POST 请求(这两个应用程序通过单点登录受信任)
  • POST 请求返回带有附加会话 cookie 的响应
  • 用户已通过身份验证

问题是使用文档中提供的客户端代码时自定义身份验证器不会触发。基本上

customAuthenticator 是通过通常的方式创建的

var customAuthenticator = WL.Client.createChallengeHandler("MyCustomRealm");

然后在客户端代码中进一步向下

var reqURL = '/my_custom_auth_request_url';
var options = {};
options.parameters = {};
options.headers = {};
customAuthenticator.submitLoginForm(reqURL, options, customAuthenticator.submitLoginFormCallback);

结果为 404

[27/05/13 10:35:07:616 NZST] 00000326 WebSphereForm I com.worklight.core.auth.ext.WebSphereFormBasedAuthenticator processRequest FWLSE0055I: Not recognized.
[27/05/13 10:35:07:616 NZST] 00000326 Authenticatio E com.worklight.core.auth.impl.AuthenticationFilter doFilter FWLSE0048E: Unhandled exception caught: SRVE0190E: File not found: /apps/services/my_custom_auth_request_url
                                 java.io.FileNotFoundException: SRVE0190E: File not found: /apps/services/my_custom_auth_request_url

发生这种情况是因为请求被 WebSphereFormBasedAuthenticator 而不是我们的 Custom Authenticator 接收。

我们正在通过以下方式将请求 URL 写入自定义身份验证器中的日志

public AuthenticationResult processRequest(HttpServletRequest request, HttpServletResponse response, boolean isAccessToProtectedResource) throws IOException,   ServletException {
        logger.info("Request URL is: " + request.getRequestURI());

但这条线永远不会被击中。

2 个身份验证器可以并排工作吗?我看到的行为是

var wlFormsAuthenticator = WL.Client.createChallengeHandler("WASLTPARealm");

var customAuthenticator = WL.Client.createChallengeHandler("MyCustomRealm");

似乎混在一起了。我认为调用submitLoginFormcustomAuthenticator 不应该被 WebSphereForms 身份验证器接收,而是应该转到我们的自定义身份验证器。

您能否澄清预期的行为和潜在的解决方法?

此外,它的作用是调用

WL.Client.login("MyCustomRealm", {
    onSuccess: function() {

    },
    onFailure: function() {

    }
});

在这种情况下,Java 代码被命中并且我们成功地验证了但是,URL 是

http://localhosT:9080/worklight/apps/services/api/MyApp/common/login

而不是my_custom_auth_request_url这意味着我们不能过滤掉 Java 代码中的请求。

希望这是有道理的。提前致谢。

4

1 回答 1

1

您的描述中似乎有多种术语。Authenticator 是服务器端实体。自定义身份验证器是用 Java 实现的。挑战处理程序是客户端实体。它是用 JavaScript 实现的。

根据您的描述,我猜您在实际尝试从 WL 服务器获取一些资源之前尝试为自定义身份验证器提交登录表单。问题是只有在您尝试访问受保护的资源时才会创建自定义身份验证器的实例。除非您首先触发身份验证,否则身份验证器将拒绝接收凭据(或更一般地说 - 它不会真正存在)。所以你的方法是正确的,你可以先调用 WL.Client.login("realm") 来触发认证过程。其他选项包括:

  1. 使用安全测试保护应用程序环境并设置 connectOnStartup:true
  2. 使用安全测试保护应用程序环境,设置 connectOnStartup:false 并使用 WL.Client.connect() API。
于 2013-05-27T11:52:46.483 回答