我正在使用的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的原因。我可以看到尝试从JMX-RMI / T3连接检索HttpServletRequest可能会导致问题,但是在javax.security.auth.callback.CallbackHandler.handle()期间引发了异常。

其他一些可能相关或可能不相关的信息,但为什么不包括我所能提供的全部信息呢?


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


我很困惑为什么它会通过一个协议而不是另一个协议来工作。其他人看到过这种行为或知道如何处理吗?

谢谢,
托德

最佳答案

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

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

10-06 03:06