Authentication 多个站点上的透明用户会话(单点登录和单点注销)

Authentication 多个站点上的透明用户会话(单点登录和单点注销),authentication,session,single-sign-on,Authentication,Session,Single Sign On,我在不同的领域有几个网站:example.com,example.org,mail.example.com 和passport.example.org。所有的网站都有共同的外观和感觉 应该共享相同的用户群 在这种极端情况下,我仍然希望所有的网站都透明(尽可能多) 使用以下关键属性共享用户会话: 单点登录。当用户登录到passport.example.org并访问 任何其他站点-他应被视为已登录 登录的用户在站点标题中获得“Hello,$username”问候语,并且不同 导航菜单,列出他们可以访

我在不同的领域有几个网站:
example.com
example.org
mail.example.com
passport.example.org
。所有的网站都有共同的外观和感觉 应该共享相同的用户群

在这种极端情况下,我仍然希望所有的网站都透明(尽可能多) 使用以下关键属性共享用户会话:

  • 单点登录。当用户登录到
    passport.example.org
    并访问 任何其他站点-他应被视为已登录

    登录的用户在站点标题中获得“Hello,
    $username
    ”问候语,并且不同 导航菜单,列出他们可以访问的服务。如果他没有登录,则改为 在问候语中有一个“登录”链接,指向
    passport.example.org/Sign

    受信任域的列表是已知的,因此实现起来相当简单 使用OpenID或homebrewn轻量级协议。当用户第一次点击 网站,我将他重定向到位于
    passport.example.org
    的特殊身份验证端点, 然后用身份信息(或“未登录”)悄悄地将他重定向回 匿名身份)包括在内。对于大多数浏览器来说,这是完全透明的。 显然,我使用nonce值来对抗重定向循环

  • 单次注销。当用户单击任何站点标题中的“注销”时 下次他访问任何网站时,他应该被视为“未登录”

    OpenID不是为此而设计的。我目前的想法(我已经有了一个部分工作的 实现)不是发送用户标识,而是发送“全局”会话令牌和共享 全局会话表(全局会话令牌↔ 数据库中的用户关系

  • 机器人和无炊具用户支持。网站有公共区域,应该 可由用户代理访问,无需任何cookie支持

    因此,我在(1)中提到的重定向成为一个问题,因为对于 每一个页面请求,我都会抛出用户代理来验证端点。 这不仅会让机器人感到困惑,还会污染我的会话数据库 很快就死掉了我绝对不想表现出“嘿, 如果您没有启用cookies,请走开!”page,这将是非常粗鲁和无礼的 令人失望。虽然我需要cookie支持才能登录,但我希望用户能够自由阅读 网站的用途等等——没有任何限制

    我明确地不想把会话ID放在URL中,除了一些透明的 我提到的跨域重定向。我认为这样做是一个安全问题 一般来说,这是一件坏事

    在这里,我几乎没有想法了

  • 好吧,我知道这很难,但谷歌实际上是通过(
    Google.com
    )来做到这一点的,
    google.
    很多gtld,
    gmail.com
    等等),对吗?所以这应该是 可能

    我会很感激协议描述的想法(这是最好的)或链接 到系统(可以是代码阅读,也可以是实时站点观看和学习) 成功地实现了这样的东西

    总而言之:几个域没有公共根、共享用户群、单点登录、单点注销,匿名浏览不需要cookie

    所有站点都位于同一个网络上(但位于不同的服务器上),并且部分位于服务器上 共享同一个PostgreSQL数据库(位于同一数据库的不同方案中)。
    大多数网站都是用Python/Django编写的,但其中一些网站使用的是PHP和Ruby on Rails。当我想到一些与框架和语言无关的东西时,我很感激能指出任何实现。即使我不能使用它们,如果我知道如何在那里实现,也许我能够实现一些类似的东西r、

    您正在使用ASP.NET吗?如果是这样,您可能需要查看一下该属性。

    好的,谷歌只是在“Google.com”中使用了一个cookie域。但谷歌也使用OpenID,它允许一个通用的登录机制。基本上,这是通过将你重定向到一个特殊的登录页面来实现的。这个登录页面会检测你是否登录,如果你没有登录,它会要求你登录。否则,它会直接将你重定向到下一个页面

    因此,在您的情况下,用户会打开somepage.example.com,而此应用程序的会话没有登录ID。因此,它会将用户重定向到logon.example.biz,用户将在那里登录。此页面后面还会有一个会话,该会话会告诉用户已登录。(或者没有,在这种情况下,用户必须先登录。)然后它重定向用户somepage.example.com?sessionid=该sessionid将存储在somepage.example.com的会话中。然后该会话还将知道用户已登录,对于用户来说,它几乎是透明的


    实际上,用户会被重定向两次。

    如果您的所有应用程序都在一个域上,那么这并不太困难,因为您可以使用域级别的cookie来处理会话控制。(无cookie会话管理很困难,但可以完成,但很困难。)

    但是,您指出了example.com域上的一些站点,以及example.org域上的一些站点

    在我的google Sign in和他们orkut.com的其他网站上玩一玩,看起来当你点击一个需要凭据的页面时,它会将你重定向到一个普通的站点进行帐户登录,然后再将你重定向回原始站点,可能会在URL中传递某种会话令牌。由此,orkut.com服务器可能会r直接与google.com服务器联系,以验证令牌并获取所需的任何其他用户信息

    有关域级cookie的更多信息,请按要求提供

    如果你