1

我在 Weblogic 10.3 中有一个自定义身份验证器,我正在使用并遇到问题。

当用户通过 HTTP 连接和验证时,一切正常。但是,如果连接是 JMX-RMI/T3 连接,javax.security.auth.callback.CallbackHandler.handle则会引发对异常的调用。ContextHandlerCallback正在使用默认构造函数,并在带有用户名和密码回调的回调数组中传递。下面是 callbackHandler 是javax.security.auth.callback.CallbackHandler的代码

callbacks = new Callback[2];
callbacks[0] = new NameCallback("username: ");
callbacks[1] = new PasswordCallback("password: ", false);  
callbacks[2] = new ContextHandlerCallback();  

callbackHandler.handle(callbacks);

这是从上面抛出的异常的顶部callbackHandler.handle(callbacks)

javax.security.auth.callback.UnsupportedCallbackException: [Security:090175]Unrecognized Callback
at weblogic.security.SimpleCallbackHandler.handle(SimpleCallbackHandler.java:71)
at com.bea.common.security.internal.service.CallbackHandlerWrapper.handle(CallbackHandlerWrapper.java:76)
at weblogic.security.service.internal.WLSJAASLoginServiceImpl$CallbackHandlerWrapper.handle(WLSJAASLoginServiceImpl.java:156)
at javax.security.auth.login.LoginContext$SecureCallbackHandler$1.run(LoginContext.java:955)
at javax.security.auth.login.LoginContext$SecureCallbackHandler.handle(LoginContext.java:951)

这是我们也看到的另一个异常跟踪:

javax.security.auth.callback.UnsupportedCallbackException: Unrecognized Callback
at weblogic.management.mbeanservers.internal.JMXAuthenticator$JMXCallbackHandler.handle(JMXAuthenticator.java:130)
at com.bea.common.security.internal.service.CallbackHandlerWrapper.handle(CallbackHandlerWrapper.java:76)
at weblogic.security.service.internal.WLSJAASLoginServiceImpl$CallbackHandlerWrapper.handle(WLSJAASLoginServiceImpl.java:156)
at javax.security.auth.login.LoginContext$SecureCallbackHandler$1.run(LoginContext.java:955)
at javax.security.auth.login.LoginContext$SecureCallbackHandler.handle(LoginContext.java:951)

值得注意的是,如果用户通过 JMX/T3 连接进行身份验证但 HTTP 工作正常,则会引发此异常。

我们试图实现的部分目标是捕获有关身份验证的信息,例如请求源自的 IP 地址,这就是我们需要ContextHandlerCallback. 我可以看到尝试HttpServletRequest从 JMX-RMI/T3 连接中检索一个可能会导致问题,但在 javax.security.auth.callback.CallbackHandler.handle() 期间会引发异常。

其他一些可能相关或不相关的信息,但为什么不尽我所能?

  • 应用程序正在使用基于表单的身份验证,WS 调用也是如此,但 JMX-RMI/T3 调用可能不会。
  • 不确定是否可以在进行身份验证时定义用于 CallbackHandler 的实现。目前我们已经定义了一个自定义的 LoginModule,但没有定义一个自定义的 CallbackHandler。
  • 如果在 ContextHandlerCallback 之外有一种方法可以访问 LoginModule 内的调用者的 IP 地址,那么这将提供一个合适的解决方法。

我很困惑为什么它会通过一种协议而不是另一种协议工作。还有其他人看到过这种行为或知道处理这种情况的方法吗?

谢谢,托德

4

1 回答 1

0

在 WebLogic 中,ContextHandlerCallback 仅为 HTTP servlet 请求定义。

您可以通过实现ConnectionFilter/ConnectionEvent接口访问所有协议(HTTP、RMI-IIOP...)上调用者的 IP 地址。您可以使用它们根据 IP 地址记录或拒绝请求。

于 2013-10-14T09:02:51.110 回答