【问题标题】:How is OAuth 2.0 "Implicit Flow" better than "Resource Owner Password"?OAuth 2.0“隐式流程”比“资源所有者密码”更好?
【发布时间】:2018-01-29 01:50:39
【问题描述】:

我刚刚开始使用 IdentityServer4,并且正在学习不同的教程和文章。

我了解不同架构有不同的流程。我主要构建单页应用程序(使用 Angular)。据我了解,我基本上有两种选择来进行身份验证然后授权:

  • 隐式流
  • 资源所有者密码(仅调用令牌端点)

我看到的每一个地方都说隐式流程会更好(在一个方面或另一方面)。

这是为什么呢?

我将成为 API 和 SPA 的产品所有者。

【问题讨论】:

    标签: oauth-2.0 identityserver4


    【解决方案1】:

    隐式流比资源所有者密码更好的原因有几个:

    1. /token 端点应该需要客户端密码,而单页应用程序 (SPA) 无法保证其密码安全。
    2. 用户通常比使用它的应用程序更信任 OAuth2 服务器。使用资源所有者密码流程时,您的应用程序会读取用户名和密码,因此用户可能不愿意输入。
    3. 您的应用程序可能存在将密码暴露给攻击者的安全问题 - 不必要的风险。
    4. 使用资源所有者密码流程,很难实现多种不同的身份验证方法。使用隐式流程,您可以免费获得它。

    也许其他人会添加我没想到的其他原因。

    【讨论】:

    • 非常感谢您的回答。我认为第 2-4 点对我目前的情况来说不是问题。这将是一个定制的内部应用程序。例如,用户当然也不想使用 google 或 facebook 帐户进行身份验证。一个相关点似乎是“客户秘密”——不幸的是,我并没有完全理解这个概念。谁会分享客户的秘密? IDP 和 API?还是SPA和IDP? (因为它也是需要存储它的 SPA...)IDP = 身份服务器,API = 资源服务器,SPA = Angular
    • 要使用 OAuth2 提供者,您需要先注册您的客户端(SPA 应用程序)。您将获得或提供一个 client_id 和一个客户端密码(密码)。这些用于访问某些 OAuth2 提供程序资源时的身份验证,例如 token 端点。但在 SPA 中,您必须在浏览器中保密,这意味着您的 SPA 的所有用户都可以看到。
    • 第 1 点值得一提,但使用 IdSvr 客户端定义,您还可以明确声明 RequireClientSecret=false,因此您不必严格维护(不安全的)客户端机密。正如您所说,SPA(或者实际上是安装在最终用户计算机上的 任何 客户端)秘密很难/不可能保密,那么为什么要麻烦呢?将 RequireClientSecret 设置为 false 并接受授权来自用户凭据而不是客户端的事实。
    • Mashton,感谢您提供的信息。我认为该选项主要用于使用身份验证代码授予流程的移动应用程序。但是您可能希望它为其他一些应用程序进行身份验证。而且我不知道token 端点是否支持 SPA 所需的 CORS 标头。
    • 因为RequireClientSecretClient 设置,您显然可以为不同的应用程序定义不同的客户端——一些使用客户端机密无法保密的流程,而另一些则需要它.至于 CORS,是的,它是可能的 - 这只是整个 IdSvr 应用程序的 ConfigureServices 的一部分,而不是特定于使用身份服务器库。像往常一样,只需定义您将接受来自(即 SPA 的主机)的呼叫的来源
    【解决方案2】:

    除了 Ján 提出的要点之外,值得注意的是,如果您使用资源所有者密码流,您将不会获得 SSO。如果您使用隐式流程,Identity Server 可以像任何网站一样存储用户,而使用资源所有者密码,您无法查看用户之前是否已通过 Identity Server 对其他服务进行身份验证。

    【讨论】:

      猜你喜欢
      • 2019-04-08
      • 2016-04-28
      • 2023-03-19
      • 2016-02-22
      • 2013-10-17
      • 2015-05-20
      • 2016-12-31
      • 2018-09-17
      • 2013-11-23
      相关资源
      最近更新 更多