【问题标题】:Can't log out from Oracle SSO无法从 Oracle SSO 注销
【发布时间】:2010-12-12 15:20:04
【问题描述】:

我正在构建一个 J2EE Web 应用程序,它使用带有 OID 后端的 Oracle SSO 作为对用户进行身份验证的方法。

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

当用户使用完应用程序后,他可以点击退出按钮;在幕后,与此按钮关联的操作使用户的会话无效并使用以下 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 注销:虽然如果他们尝试访问索引页面会创建一个新会话,但不会向他们显示 SSO 登录页面,他们可以直接进入无需验证即可访问主页。只有当他们手动从浏览器中删除 cookie 时,登录页面才会再次显示 - 这不是我需要的:用户每次从应用程序中注销时都必须提供他们的登录名/密码,所以我相信一定有问题删除 cookie 的代码。

非常感谢任何有关此问题的帮助,在此先感谢。

【问题讨论】:

    标签: java oracle cookies single-sign-on oid


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      您需要一个名称为 logout 的页面,其中包含这些 JavaScript 函数。

      documentation 是这么说的:

      WebGate 在收到包含以下内容的 URL 时将用户注销 “登出。” (包括“.”),但 logout.gif 和 logout.jpg,例如 logout.html 或 logout.pl。当 WebGate 接收带有此字符串的 URL,设置 ObSSOCookie 的值 到“注销。

      【讨论】:

        【解决方案3】:

        在浏览器关闭之前,Cookie 不会“删除”。

        【讨论】:

          猜你喜欢
          • 2017-09-08
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-07-09
          • 2021-01-02
          • 1970-01-01
          • 2013-10-12
          相关资源
          最近更新 更多