使用 Auth0 单点登出所有应用程序

Posted

技术标签:

【中文标题】使用 Auth0 单点登出所有应用程序【英文标题】:Single Sign out in All application using Auth0 【发布时间】:2015-08-24 05:26:22 【问题描述】:

我有这样的网址“http://mywebsite.com”。我正在使用 Auth0 登录我的 Web 应用程序。一旦用户登录我的应用程序,我将使用相同的登录名(单点登录)将用户登录到我的 wordpress 网站和其他网站。用户从我的应用程序注销后,我还需要从 wordpress 和其他网站注销(单点登录关闭/注销)。

有可能吗?

请提出更好的选择

【问题讨论】:

【参考方案1】:

要从多个应用程序中注销用户,您可以定期使用 checkSession() 方法检查用户的 auth0 会话是否已过期。如果用户没有活动会话,您可以从应用程序中注销用户。

// check every 15 minutes if the SSO session is still active

    setInterval(function() 
      // if the token is not in local storage, there is nothing to check (that is, the user is already logged out)
      if (!localStorage.getItem('userToken')) return;

      auth0.checkSession(function (err, data) 
        if (err)  
          // if we get here, it means there is no session on Auth0,
          // then remove the token and redirect to #login
          localStorage.removeItem('userToken');
          window.location.href = '#login';
        
      );
    , 900000)

https://auth0.com/docs/sso/current/single-page-apps#single-log-out https://auth0.com/docs/migrations/guides/legacy-lock-api-deprecation#session-management

要清除服务器会话,您只需将用户重定向到 /v2/logout 端点。 https://auth0.com/docs/logout/guides/logout-auth0

如果用户使用外部身份提供商登录,您可以通过在调用/v2/logout时添加federated查询字符串参数来强制用户退出IDP端点 https://auth0.com/docs/logout/guides/logout-idps

对于 SAML IDP,您必须在连接设置中配置 SAML 注销 URI。 https://auth0.com/docs/logout/guides/logout-saml-idps

【讨论】:

【参考方案2】:

@udayr 的回答让我走上了正确的道路:

我实际上使用的是 ASP.Net Owin,所以我在我的所有应用程序的 Auth0AccountController 处创建了 LogOff 端点的重载,如下所示:

    [HttpGet]
    public ActionResult LogOff() 
        return this.LogOff("");
    

然后我添加了一个 SLO (Single Log Of) 视图并在上面放了以下代码:

<iframe id="app1"   src="http://app1.localtest.me/Auth0Account/LogOff"></iframe>

<iframe id="app2"   src="http://app2.localtest.me/Auth0Account/LogOff"></iframe>

<h2 id="message">Logging off, please wait...</h2>

<script>

    var app1Ready = false;
    var app2Ready = false;

    $('iframe').load(function (e) 

        switch ($(e.target).attr("id")) 
            case "app1":
                app1Ready = true;
                break;
            case "app2":
                app2Ready = true;
                break;
        

        if (app1Ready && app2Ready) 

            $("#message").html("You have been Logged Off successfully!");

        

    );

</script>

基本上,我们需要通过 iframe 对新的 LogOff 端点进行 Get 调用,唯一的缺点是所有应用程序都需要知道所有其他应用程序的 Log Off URL,这需要在所有应用程序上实现他们。

【讨论】:

【参考方案3】:

此时我也有同样的要求。我也在使用Auth0。

从他们的文档中,我了解到调用 Auth0 注销端点只会清除 Auth0 上的 SSO cookie,并且不会注销所有其他应用程序。我们有责任为每个应用程序清除会话。

这里使用 Auth0 anjularjs 示例进行了解释https://github.com/auth0/auth0-single-sign-out-sample

希望这会有所帮助。

【讨论】:

【参考方案4】:

个人没有任何经验,但这是直接来自 Auth0 上的文档:

“这将清除 Auth0 为该用户设置的任何单点登录 cookie。如果您还想将用户从其身份提供者中注销,请在注销 URL 中添加联合查询字符串参数:

https://appname.auth0.com/v2/logout?federated"

【讨论】:

以上是关于使用 Auth0 单点登出所有应用程序的主要内容,如果未能解决你的问题,请参考以下文章

cas系列-cas登出

绝对完全跨域统一单点登录登出

CAS单点登出了还能获取到用户登陆信息

SSO 单点登录详解

整合spring cloud云架构 - SSO单点登录之OAuth2.0 登出流程

spring cloud云架构 - SSO单点登录之OAuth2.0 登出流程