我在10.3版上创建了一个自定义WebLogic安全身份验证提供程序,其中包括一个用于验证用户的自定义登录模块。作为提供者的一部分,我实现了servletauthenticationfilter并添加了一个过滤器。该筛选器用作域中所有应用程序的公共登录页。
当我们通过在地址栏中输入任何安全的URL来访问它们时,在IE和火狐中都可以正常工作。但是当我们把链接加入IE时,会发生一件奇怪的事情。如果我单击书签,您将看到我们的登录页面,然后在您成功登录系统后,将显示基本认证页面,即使用户已经过认证。这在Firefox中从来没有发生过,只有IE。它也是间歇性的。5个IE中有1个时间将正确重定向,并且不显示基本身份验证窗口。火狐和Opera每次都会正确重定向。我们捕获了响应头并比较了成功和失败,它们是相同的。
final boolean isAuthenticated = authenticateUser(userName, password, req);
// Send user on to the original URL
if (isAuthenticated) {
res.sendRedirect(targetURL);
return;
}
如您所见,一旦用户通过身份验证,我将重定向到原始URL。我错过了一步吗?authenticateuser()方法是从Oracle文档中的一个示例中逐字提取的。
private boolean authenticateUser(final String userName, final String password, HttpServletRequest request) {
boolean results;
try {
ServletAuthentication.login(new CallbackHandler() {
@Override
public void handle(Callback[] callbacks)
throws IOException, UnsupportedCallbackException {
for (Callback callback : callbacks) {
if (callback instanceof NameCallback) {
NameCallback nameCallback = (NameCallback) callback;
nameCallback.setName(userName);
}
if (callback instanceof PasswordCallback) {
PasswordCallback passwordCallback = (PasswordCallback) callback;
passwordCallback.setPassword(password.toCharArray());
}
}
}
}, request);
results = true;
} catch (LoginException e) {
results = false;
}
return results;
我在这里问这个问题是因为我不知道问题是与WebLogic配置还是代码有关。如果这个问题更适合ServerFault,请告诉我,我会在那里发布。
奇怪的是,它每次在Firefox和Opera中都能工作,但在Internet Explorer中却不行。我希望不使用Internet Explorer是一个选项,但它目前是公司标准。如有任何帮助或指示,我们将不胜感激。我已经对IE6&8进行了测试,并在3个不同的环境中部署了定制的提供者,我仍然可以复制这个bug。