我在 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 地址,那么这将提供一个合适的解决方法。
我很困惑为什么它会通过一种协议而不是另一种协议工作。还有其他人看到过这种行为或知道处理这种情况的方法吗?
谢谢,托德