我正在构建一个 J2EE Web 应用程序,它使用带有 OID 后端的 Oracle SSO 作为对用户进行身份验证的方法。
如果用户想要使用该应用程序,首先他必须在 SSO 的登录页面提供有效的登录名/密码。
当用户使用完应用程序后,他可以点击注销按钮;在后台,与此按钮关联的操作使用户的 session 无效并使用以下 Java 代码清除 cookie:
private void clearCookies(HttpServletResponse res, HttpServletRequest req) {
res.setContentType("text/html");
for (Cookie cookie : req.getCookies()) {
cookie.setMaxAge(0);
cookie.setPath("/");
cookie.setDomain(req.getHeader("host"));
res.addCookie(cookie);
}
}
另外,我有一个与注销按钮相关联的 onclick JavaScript 事件,它应该通过调用 delOblixCookie() 函数来删除 SSO cookie(如在某些 Oracle 论坛中找到的):
function delCookie(name, path, domain) {
var today = new Date();
// minus 2 days
var deleteDate = new Date(today.getTime() - 48 * 60 * 60 * 1000);
var cookie = name + "="
+ ((path == null) ? "" : "; path=" + path)
+ ((domain == null) ? "" : "; domain=" + domain)
+ "; expires=" + deleteDate;
document.cookie = cookie;
}
function delOblixCookie() {
// set focus to ok button
var isNetscape = (document.layers);
if (isNetscape == false || navigator.appVersion.charAt(0) >= 5) {
for (var i=0; i<document.links.length; i++) {
if (document.links.href == "javascript:top.close()") {
document.links.focus();
break;
}
}
}
delCookie('ObTEMC', '/');
delCookie('ObSSOCookie', '/');
// in case cookieDomain is configured delete same cookie to all subdomains
var subdomain;
var domain = new String(document.domain);
var index = domain.indexOf(".");
while (index > 0) {
subdomain = domain.substring(index, domain.length);
if (subdomain.indexOf(".", 1) > 0) {
delCookie('ObTEMC', '/', subdomain);
delCookie('ObSSOCookie', '/', subdomain);
}
domain = subdomain;
index = domain.indexOf(".", 1);
}
}
但是,我的用户在点击注销按钮后没有从 SSO 注销:虽然如果他们尝试访问索引页面会创建一个新 session ,但 SSO 登录页面不会显示给他们,他们可以直接访问到主页而无需进行身份验证。只有当他们从浏览器中手动删除 cookie 时,登录页面才会再次出现——这不是我所需要的:用户每次从应用程序注销时都必须提供他们的登录名/密码,所以我相信一定有问题删除 cookie 的代码。
在此先感谢您对这个问题的任何帮助。
最佳答案
Oracle 有两个 Web SSO 产品 - Oracle Access Manager 和 Oracle Single Sign On。您发布的 Javascript 代码用于访问管理器,因此对您没有帮助。此外,您无需在 Javascript 中执行任何操作即可将用户注销。
看看 logout OSSO 文档的一部分。它建议使用以下代码:
// Clear application session, if any
String l_return_url := return url to your application
response.setHeader( "Osso-Return-Url", l_return_url);
response.sendError( 470, "Oracle SSO" );
关于java - 无法从 Oracle SSO 注销,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1667215/