security - 使用 openid connect 作为多个应用程序的 SSO

标签 security oauth-2.0 openid-connect

我正在尝试使用 openid connect 为我的应用程序创建 SSO。
基本上我们有一个 API 层,不同的应用程序(客户端)将使用这一层的服务。
首先,我们为每个不同的应用程序添加了 OAuth2.0 授权;对于身份验证,我们目前使用我们自己的数据库 (IDP)
我们希望最终用户拥有此流程的单点登录体验。
为此,我们在我们构建的 OAuth 流程之上添加了 openid。
Web 服务器具有标准的 oauth + openid 实现,并具有以下内容

  • 显式流
  • 隐式流
  • 密码授予

  • 添加 openid 连接后,服务器现在也可以发送 id_token (jwt),具体取决于范围和请求类型
    注册了两个客户端(C1 和 C2)
    步骤 1:C1 遵循显式流程并使用响应类型作为代码,因此当用户 (U1) 访问 C1 时,它被重定向到 U1 输入凭据的身份验证服务器。
    步骤2:授权服务器验证凭据并提示用户同意,确认谁将代码发送到C1的redirect_uri
    第三步:C1然后请求一个token,服务器给出一个access_token和一个id_token;访问 token 保存在数据库中
    第 4 步:U1 现在需要访问 C2
    问题:
  • C2 从 api 服务器获取访问 token 而无需用户再次登录的最佳方式/实践是什么。
  • 如果 C1 通过本地存储或任何其他方式将 jwt id_token 传递给 C2,一种可能的方法是在 this 之后将 id_token 交换为 access_token。 .
  • 如果我们采用上述方法,仅验证 id_token 并发出 access_token 是否就足够了,或者我们是否应该添加任何其他检查
  • 任何其他方法。

  • 谢谢

    最佳答案

    流量的选择取决于客户的类型。例如,客户端可能是一个 native 应用程序,它可以使用授权代码流(我猜您将显式流称为此流)。或仅在浏览器上运行的 JavaScript 应用程序。

    解决方案 - 基于 session cookie 的 SSO

    在 OAuth 2.0(包括 OpenID Connect)中,最终用户(例如:如您的示例中的 U1)身份验证通过浏览器交互进行。在这个过程中,通常授权服务器建立 session 。此 session 所做的是保留对先前经过身份验证的用户的引用。例如,这允许用户访问 IDP 并更新用户在那里的内容(如果您的身份提供商支持)。

    现在,如果两个应用程序使用相同的浏览器(例如:- Microsoft Edge)在 OpenID Connect 的授权请求中显示登录屏幕,您的授权服务器可以检查浏览器存在的 session cookie。如果是这种情况,授权服务器可以跳过登录屏幕和相关内容的响应。以下是全新登录的示例场景

  • C1 统计并发送授权请求
  • 授权服务器接收请求并检查 session cookie。
  • 由于这是一个全新的开始,不存在 cookie,因此存在登录
  • 用户U1登录
  • 授权服务器发送响应和C1完成 token 获取
  • C2启动并发送授权请求
  • 授权服务器接收请求并检查 session cookie。
  • 由于我们使用相同的浏览器,因此存在 session cookie 并且相关用户被标识为 U1
  • 授权服务器发送响应和C2完成 token 获取

  • 现在 C1 和 C2 都有 U1 用户登录到它们。这是基于浏览器的 SSO。

    关于security - 使用 openid connect 作为多个应用程序的 SSO,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51824340/

    相关文章:

    c# - ASP.NET MVC5 文件下载安全最佳实践?

    c - 如何从 root 使用 setuid() 成为用户,以后有可能再次成为 root?

    java ssl错误无法支持TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384

    java - 使用 JCA 高效检查大型数据集的签名

    saml-2.0 - IdP使用ThinkTecture IdentityServer v3启动登录

    oauth-2.0 - IDX10501 : Signature validation failed. 无法匹配 key

    c# - 用作另一个 IdentityServer 的外部身份提供者的 IdentityServer 无法正确重定向

    python-2.7 - 导入错误 : No module named cryptography. hazmat.bindings._openssl

    google-app-engine - 谷歌应用引擎 : Endpoints authentication when custom auth or Open ID is used

    python - 在没有 OAuth 同意屏幕的情况下尝试授权 AWS Lambda 进行 Google Calendar API 调用