2013-05-26 245 views
1

我们正在构建具有2步身份验证过程的Worklight应用程序。Multi-Realm身份验证(Forms +自定义身份验证器)

第1步:窗体身份验证
我们正在使用的开箱WASLTPARealm这验证我们对在WebSphere定制JAAS模块,并返回一个LTPA令牌。这按预期工作。

步骤2:自定义身份验证
第二个步骤是一个自定义的身份验证和登录模块其中:

  • 读取在步骤1中
  • 已设置的LTPA饼干使POST请求到另一个应用程序与LTPA cookie(这2个应用程序是通过单一登录信任的)
  • 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而不是我们的自定义身份验证器拾取。

我们通过

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

写请求URL到自定义认证里面的日志,但该行从来没有被击中。

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

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

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

似乎搞混。我认为在customAuthenticator上调用submitLoginForm不应该被WebSphereForms认证器获取,而应该转到我们自定义的认证器。

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

此外,这是什么工作,呼吁

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

    }, 
    onFailure: function() { 

    } 
}); 

在这种情况下,Java代码被击中,我们成功地验证,网址是

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

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

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

回答

1

在您的描述中似乎有混合的术语。 验证器是服务器端实体。定制认证器是用Java实现的。 挑战处理程序是一个客户端实体。它是用JavaScript实现的。

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

  1. 保护应用程序环境中使用的安全性测试和设置connectOnStartup:真
  2. 保障使用安全测试,设置connectOnStartup应用环境:虚假和使用WL.Client.connect()API。
+0

不要混淆变量的命名。他们应该被称为'wlFormsChallengeHandler'和'customChallengeHandler'。我确实理解客户端和服务器端实体的概念和区别。正如我所提到的,我已经**使用'WL.Client.login()'方法,但是正在使用的URL不是我在客户端代码中指定的自定义URL,而是它的'baseurl/login '因此无法在** Java **代码中执行过滤。 – Marko

+0

您能解释一下您将用于Forms Authenticator和Custom Authenticator解决方案组合的过程吗,特别是在客户端代码中? – Marko

+0

/my_custom_auth_request_url仅用于发送凭证。 WL.Client.login(“realm”)应该向/ login API发出请求,这是可以的。发出WL.Client.login(..)请求时会发生什么?你有什么回应? – Anton