我在 10.3 版上创建了一个自定义 Weblogic 安全身份验证提供程序,其中包括一个用于验证用户的自定义登录模块。作为提供者的一部分,我实现了 ServletAuthenticationFilter 并添加了一个过滤器。过滤器充当域内所有应用程序的公共登录页面。
当我们通过在地址栏中输入任何安全 URL 来访问它们时,这在 IE 和 Firefox 中运行良好。但是当我们在 IE 中为链接添加书签时,会发生奇怪的事情。如果我单击书签,您将看到我们的登录页面,然后在您成功登录系统后,即使用户已经通过身份验证,也会显示基本身份验证页面。这在 Firefox 中永远不会发生,只有 IE 才会发生。也是断断续续的。5 次中有 1 次 IE 将正确重定向并且不显示基本身份验证窗口。Firefox 和 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 是一种选择,但它目前是公司的标准。任何帮助或方向将不胜感激。我已经针对 IE 6 和 8 进行了测试,并在 3 个不同的环境中部署了自定义提供程序,但我仍然可以重现该错误。