多领域认证(表单+自定义认证器)



我们正在构建一个Worklight应用程序,它有两个步骤的身份验证过程。

步骤1:表单认证
我们使用的是现成的WASLTPARealm,它根据WebSphere中的自定义JAAS模块对我们进行身份验证,并返回LTPA令牌。

步骤2:自定义认证器
第二步是自定义认证器和登录模块,它:

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

问题是,当使用文档中提供的客户端代码时,Custom Authenticator不会触发。基本上

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而不是我们的自定义Authenticator拾取。

我们通过

将请求URL写入自定义验证器中的日志
public AuthenticationResult processRequest(HttpServletRequest request, HttpServletResponse response, boolean isAccessToProtectedResource) throws IOException,   ServletException {
        logger.info("Request URL is: " + request.getRequestURI());

但是这一行永远不会被击中。

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

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

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

似乎弄混了。我认为在customAuthenticator上调用submitLoginForm不应该被WebSphereForms authenticator拾取,而应该去我们的自定义一个。

你能澄清预期的行为和潜在的解决方案吗?

同样,调用

是有效的
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代码中的请求。

希望这是有意义的。

你的描述中似乎混淆了一些术语。验证者是服务器端实体。自定义身份验证器是用Java实现的。挑战处理程序是一个客户端实体。它是用JavaScript实现的。

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

  1. 使用安全测试保护应用程序环境并设置connectOnStartup:true
  2. 使用安全测试保护应用程序环境,设置connectOnStartup:false并使用WL.Client.connect() API。

最新更新