Authentication SSO(单点登录)是如何工作的

Authentication SSO(单点登录)是如何工作的,authentication,oauth-2.0,single-sign-on,Authentication,Oauth 2.0,Single Sign On,我正试着绕着SSO转。据我所知,SSO允许您登录一次并访问多个应用程序(如果您有权限的话)。因此,我登录到应用程序A。我建立了一个令牌。应用程序B如何使用该令牌,以便我不必再次登录应用程序B(假设用户拥有A和B的权限)?我的应用程序是AngularJs应用程序。我访问.NETWebAPI获取数据 我可以查看我是否登录到应用程序A并检索令牌,然后通过将令牌传递给应用程序B从应用程序A启动应用程序B。这样,应用程序B就拥有令牌并可以发送到服务器,以确保用户可以访问B。但是,如果用户直接打开浏览器并转

我正试着绕着SSO转。据我所知,SSO允许您登录一次并访问多个应用程序(如果您有权限的话)。因此,我登录到应用程序A。我建立了一个令牌。应用程序B如何使用该令牌,以便我不必再次登录应用程序B(假设用户拥有A和B的权限)?我的应用程序是AngularJs应用程序。我访问.NETWebAPI获取数据

我可以查看我是否登录到应用程序A并检索令牌,然后通过将令牌传递给应用程序B从应用程序A启动应用程序B。这样,应用程序B就拥有令牌并可以发送到服务器,以确保用户可以访问B。但是,如果用户直接打开浏览器并转到应用程序B,那么他们如何使用现有令牌建立会话

如果答案是后端服务器上存在会话状态,那么会话状态如何将登录应用程序A的用户与新的应用程序B请求相匹配


谢谢。

好吧,实现它的方法当然有很多,而且可能很棘手。我可以给你一个解决方案作为例子:

考虑不同子域上的两个应用程序:

The Fine Corinthian Turkey Shop (turkey.example.com)
Rent a Baboon (monkey.example.com)
这两个web应用程序希望共享登录,并为其单一登录安排第三个托管网站:

sso.example.com
那么流程是:

  • 坦率的访问
  • 土耳其转向
  • SSO向用户提供登录表单,验证并颁发令牌
  • 令牌保存在SSO上的cookie中
  • 用户现在已通过SSO验证,但需要将令牌返回土耳其
  • SSO在服务器上存储(Guid、令牌、到期)的组合,其中Guid是随机Guid,到期时间大约为30秒
  • SSO在*.example.com上设置包含Guid的安全cookie
  • SSO重定向回
  • 土耳其现在可以从cookie中检索票据
  • Turkey调用SSO服务器并将票据交换为令牌
  • Turkey在浏览器中存储令牌(通常为cookie)

  • 现在让我们想象一下,弗兰克想要一些美味多汁的狒狒来搭配火鸡:

  • 坦率访问:
  • Monkey发现Frank没有存储令牌,于是重定向到
  • SSO看到Frank已经登录,因为他有一个存储的令牌
  • SSO在服务器上存储新的(Guid、令牌、到期)三元组
  • 这个过程与最初登录的过程完全相同
  • 然而,若用户直接打开浏览器并转到应用程序B,那个么该怎么做呢 他们的会话是否使用现有令牌建立

    如果答案是后端服务器上存在会话状态,则 会话状态如何使登录到应用程序A的用户与新用户匹配 申请应用程序B

    我想说,与其说是代币,不如说是cookies和重定向。一旦建立了用户的身份,就会生成令牌

    因此,当您通过浏览器点击应用程序B时,应用程序B会将您的用户代理重定向到身份验证服务器(这反过来可能会将您重定向到SSO站点)

    需要注意的是,SSO登录请求实际上是浏览器和SSO服务器之间的HTTP请求

    因此,SSO cookie已经存在了——因为在前面,应用程序A还将您的用户代理重定向到执行登录的Auth/SSO服务器。然后,SSO服务器可以在您和它之间保留一个cookie

    我可以查看是否登录到应用程序A并检索令牌,然后启动应用程序B 通过将令牌传递给应用程序B,从应用程序A

    我不确定我是否理解应用程序A将其令牌传递给应用程序B。通常应用程序(Oauth 2.0客户端)不会共享令牌。应用程序B应向授权服务器发出自己的请求,授权服务器(如果用户已登录)可能会跳过登录部分,但随后需要验证:

  • 应用程序B对请求的作用域具有权限,并且

  • 已登录用户已授予对这些作用域的访问权限

  • 如果用户已登录并具有以前批准的范围访问权限,则所有这些处理对最终用户来说都是无缝的,而不是一堆重定向

    假设您使用隐式授权流(我注意到您的一个应用程序是angularjs应用程序)

    如果您使用Oauth2.0授予的代码、密码或客户端凭据,则在初始用户登录并获得同意后,您可能会收到一个刷新令牌


    刷新令牌等同于长期访问(仅适用于该应用程序),无需再次登录并获得最终用户的多次同意

    sso.example.com
    在Frank转到
    monkey.example.com
    时存储cookie和相同的cookie帮助。如果
    sso.example.com
    觉得cookie太旧,那么它可以再次请求登录
    auth

    这是你的标题在谷歌上的第一次点击:@thebjorn我读了大约20次第一次点击链接,但我仍然无法理解服务器到底是通过什么意识到浏览器已经登录的,可能是因为该文本是针对普通公众而不是程序员的,虽然下面的答案很明显地表明,这一切都是由于
    HMTL5本地存储
    ,但这是否也意味着使用SSO绝对需要JS?@TimoHuovinen You不需要本地存储/JS。auth/sso/login服务器以正常方式记录用户(使用会话/cookie/甚至本地存储,只要它能告诉用户下次访问login服务器时已登录)。当客户端服务器需要用户在显示页面之前登录时,它不提供登录表单,而是重定向到loginserver。由于登录服务器知道用户已登录,它会发回一条消息说“这是用户123”,并且由于客户机服务器信任登录服务器,它会在本地登录用户123,而无需密码。@TimoHuovinen.显然,来自登录服务器的消息需要安全地通信。一种方法是加密消息并将其作为重定向中的get参数发送。。(这很简单,但会将消息透露给用户)。或者我们只发送一个“令牌”,一个唯一的随机值。cli