【问题标题】:Is this the proper use of OpenID Connect for this use case?对于这个用例,这是正确使用 OpenID Connect 吗?
【发布时间】:2015-07-30 06:43:30
【问题描述】:

我试图了解如何在以下用例中使用 OpenId Connect。假设我们只有以下 3 个组件:

  • 具有公开 API(Service Provider aka SP)的 Web 应用。
  • 单独的身份验证服务器(Identify Provider aka IDP)用于 使用上述 SP 进行 SSO。
  • 最终用户使用的本机客户端应用程序。此客户端应用程序使用 SP 的 API。

所有流量都将通过 HTTPS。以下是我设想的 OpenID Connect 流程的工作方式:

  1. 本机应用程序将向 SP 请求“令牌”。
  2. SP 会看到用户未通过身份验证并要求 来自受信任的 IDP 的验证。
  3. 将用户凭据提供给 IDP 后,IDP 将 将 ID 令牌和访问令牌返回给 SP。
  4. SP 将验证 ID 令牌并将访问令牌提供给 用于对 API 的所有后续请求的本机客户端应用。

这是在这种情况下使用 OpenID Connect 的推荐方法吗?任何明显的安全问题?我看到的唯一一个是本机客户端应用程序可以使用访问令牌访问 IDP 的用户信息端点。

【问题讨论】:

    标签: authentication single-sign-on openid openid-connect


    【解决方案1】:

    关于第 1 - 4 点:

    1. 从 IDP 而非 SP 请求的令牌。 (通常 IDP 托管在单独的子域上)。我喜欢 STS 术语(Security Token Service)而不是 IDP,它很容易描述 OIDC 服务器的角色:发布令牌的软件。

    2. 我更愿意说:从本机应用程序到 SP 的每个请求,受保护(非匿名)必须由 STS/IDP 验证。将 IDP 视为受保护资源/API/SP 和本机应用程序/RP/客户端之间的防火墙。

    3. IDP 响应取决于所使用的流(代码、隐式、混合、资源所有者、客户端凭据)。这个要点可能有助于快速理解流程:OIDC and OAuth2 Flows

    4. 设计用于客户端/RP/本机应用程序的 ID 令牌。

    我认为所描述的用例很常见,由 OpenIDConnect+OAuth2 处理。关于访问用户信息端点,它完全取决于您的 IDP 配置和 RP/Client/NativeApp 配置。

    示例: 我使用IdentityServer3 作为 IDP/STS(其官方认证的 OpenID Connect 提供程序):在 IdentityServer3 中,我可以通过配置禁用任何端点并限制 RP 范围。

    总结一下:我认为用你总结的用例是推荐的。唯一的问题是我在上面强调的一些小误解。但最重要的是不要选择错误的流程或通过错误配置滥用标准。

    希望它有用。

    【讨论】:

    • 要扩展您对由 OIDC+OAuth2 处理的这个用例的评论,这可能是一个更好的解决方案。 SP 不会与本机应用程序共享访问令牌。 SP 将仅将其用于访问 IDP 上的用户信息端点。然后,SP 将生成自己的 OAuth 令牌以提供给本机应用程序以供后续调用。基本上使用 OIDC 对用户进行身份验证,并使用 OAuth 使用本机应用程序进行会话跟踪。这将提供更好的分离。
    • 我不确定我是否理解它如何提供更好的分离(以及有什么意义?)。任何 OP (OIDC) 提供者都是隐含的 OAuth2 提供者。没有 OAuth2,OIDC 就无法存在。所以 OP 应该处理所有的认证和授权逻辑,包括会话管理。 SP 如何生成自己的 OAuth 令牌?从哪里? SP 也是数据提供者,所以除了提供数据之外,为什么还要赋予它安全责任。希望它有用,虽然我可能会误解。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多