如何向启用 OpenID 的站点添加注销功能?

Posted

技术标签:

【中文标题】如何向启用 OpenID 的站点添加注销功能?【英文标题】:How to add logout feature to an OpenID enabled site? 【发布时间】:2010-12-30 10:35:59 【问题描述】:

我最近在我的网站上添加了 OpenID 登录。但我不知道如何添加注销功能。

例如,单击“登录”按钮时,我可以显示所选 OpenID 提供商的登录表单,例如 Google 帐户。但是,我不知道如何实现退出按钮以退出 Google 帐户。

请指教。

【问题讨论】:

【参考方案1】:

各个 OpenID 提供商提供不同的 URL 用于注销,用户可以重定向到这些 URL。

谷歌:https://www.google.com/accounts/Logout

雅虎:https://login.yahoo.com/config/login?logout=1

已经讨论过允许 OP 提供这些 URL 作为标准的一部分;请参阅 OpenID 邮件列表中的 this discussion。

【讨论】:

我猜这些 URL 很快就会停止接受 GET 注销请求。当任何随机站点可以通过让您的浏览器执行 GET 请求(例如,在页面上嵌入图像、iframe、重定向)来让您退出所有 google 服务(以及由 google 验证的其他服务)时,这远非有趣。该 URL 应提供包含 POST 提交按钮和 CSRF 保护的确认页面。 @MikkoRantalainen 很好,2 年后,它们仍然可以正常工作。 我已经为 Google 和 Yahoo 实现了 OpenID,通过向上述注销地址发出 Jquery ajax 请求,注销就像一个魅力。我不知道它是否正确,但对于我们的敏捷过程来说,它是一个很好的解决方案:),使用 Iframe 可能会更好!!。 OpenID Connect 确实提供了使用 3 种方法的单次注销。其“会话管理规范”的一部分,前通道(基于 HTTP)和后通道方法【参考方案2】:

OpenID 依赖方无法将用户从 OP 中注销,只能实现本地注销。就像 RP 不能让用户登录到 OP 一样。

【讨论】:

是的。您要求的是 OpenID 未实现的单点登录功能。 OpenID 没有实现这一点,但主要的 OpenID 提供商(谷歌和雅虎)【参考方案3】:

我认为您正在混合范式(讨厌这个词,但现在想不出更好的词来使用)。您的登录链接将用户发送到他们的 OpenID 提供商进行身份验证,但重要的不是用户登录到他们的 Google 帐户,而是通过 OpenID 提供凭据登录到您的网站。用户很可能已经登录到他们的 OpenID 提供商;你不(不能)知道也不必关心。

同样,您网站上的注销链接应该只将用户从您的网站中注销,使他们恢复到与单击登录按钮之前相同的状态。用户可能已经退出了他们的 OpenID 提供者;你既不知道也不关心。这个网站就是一个很好的例子:)。

【讨论】:

如果这两种范式是 1) 终止会话和 2) 从身份提供者注销,那么恕我直言,用户在点击注销时期望第二个。什么用户关心服务器的会话?他们希望确保某人无法在没有明确重新验证的情况下访问他们的计算机、单击您的站点并创建新会话。在这方面,我不同意 SO 的注销方法。也许“注销”术语不再适用于使用 SSO 的网站,而支持 ???单次登出?【参考方案4】:

只需销毁会话。

【讨论】:

【参考方案5】:

您只能为 OpenID 实现本地注销。正如 Charles Duffy 所说,您始终可以使用特定的 url,但前提是用户使用的是您知道注销 url 的提供程序。如果您的用户在登出您的网站时发现他的所有 Google 帐户都已登出,那可能会令人沮丧。

查看问题的另一种方式是,您是否要确保登录您网站的人始终需要输入他的密码,而不是在他已经登录到 openid 提供程序时才登录。

如果他们从公共终端使用它(恕我直言),它会提供更好的安全性。这将确保登录的用户始终需要重新验证他的密码。

要做到这一点实际上很简单,只需使用 PAPE 扩展 openid.ns.pape = "http://specs.openid.net/extensions/pape/1.0"。 openid.pape.max_auth_age = 0

在您登录 OpenID 提供商时作为 URL 的一部分。

更多信息在这里http://code.google.com/apis/accounts/docs/OpenID.html

【讨论】:

至少有一次,我有一个业务需求,要求用户在登出我的网站时从任何地方登出——如果没有其他原因,因为这就是 Facebook 的单点登录方式-on 工作。仅仅因为它不方便和烦人并不意味着它不是“想要的”行为。 叹息【参考方案6】:

以下是我可以从 Google 注销的一个技巧:

<iframe id="myIFrame" src="" style='display:none;' > 
 function logOutGoogle()
     document.getElementById('myIFrame').src='https://www.google.com/accounts/Logout';
     timeOut();
 

【讨论】:

【参考方案7】:

我正在做我的项目并陷入注销问题 我不知道怎么像你那样做 我已经通过重置所有cookie来解决 因为我不知道设置登录状态的 cookie 我需要知道它。

【讨论】:

我认为清除所有 cookie 会注销他登录过的所有网站的用户,例如 Google、Yahoo!、Facebook 等。不确定我是否正确。可以发一下代码吗?【参考方案8】:

你必须在openid提供者成功验证后创建了一些会话变量,你只需要销毁这些会话变量。您不能销毁由 openid 提供程序创建的会话。

【讨论】:

【参考方案9】:

这是退出 Google 和您的 RP 的可靠解决方案。

只需调用这个 URI

https://www.google.com/accounts/Logout?continue=https://appengine.google.com/_ah/logout?continue=https://www.yourapp.com

它将退出谷歌并重定向回您的应用程序。谢谢!

很快我将发布我的 windows live 和 facebook.com STS 的注销解决方案。

【讨论】:

以上是关于如何向启用 OpenID 的站点添加注销功能?的主要内容,如果未能解决你的问题,请参考以下文章

在IIS上启用WordPress子域名模式多站点功能

子目录中的 Wordpress 站点,注销功能失败

开放标识。你如何注销

IdentityServer4- 使用OpenID Connect添加用户身份验证(implicit)

Win10鼠标右键如何添加快捷关机注销等功能?

SharePoint Online 站点启用内容编辑器部件