2009-11-03 79 views
4

我正在构建一个J2EE Web应用程序,该应用程序使用带有OID后端的Oracle SSO作为认证用户的手段。无法从Oracle SSO注销

如果用户想要使用该应用程序,首先他必须在SSO的登录页面上提供有效的登录名/密码。

当用户使用该应用程序时,他可以点击注销按钮;在幕后,与此按钮相关的操作无效用户的会话,并使用下面的Java代码清除了饼干:

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事件,这是为了

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登出他们打注销按钮后:虽然新的会话是通过调用delOblixCookie()函数(如在某些甲骨文论坛找到)删除SSO饼干如果他们尝试访问索引页面时创建,那么SSO登录页面不会显示给他们,他们可以直接进入到主页面而无需认证。只有当他们手动从浏览器中删除cookie时,登录页面才会再次显示 - 而不是我所需要的:用户每次从应用程序注销时都必须提供其登录名/密码,所以我相信在应用程序中出现错误删除Cookie的代码。

我非常感谢这个问题的任何帮助,在此先感谢。

回答

3

Oracle拥有两个Web SSO产品 - Oracle Access Manager和Oracle Single Sign On。您发布的Javascript代码是针对Access Manager的,所以它不会对您有所帮助。此外,您不需要在Javascript中执行任何操作以将用户注销。

查看OSSO文档的logout部分。它建议使用下面的代码:

// 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"); 
0

Cookies不会“删除”,直到浏览器关闭。

1

你需要一个页面,用注销的名字,包括那些JavaScript函数。

这就是documentation说什么:

的WebGate将用户登录时进行接收含有 一个URL“注销”。 (包括“。”),除logout.gif和 logout.jpg外,例如logout.html或logout.pl。当WebGate 接收到包含此字符串的URL时,ObSSOCookie的值将设置为 以“注销”。