【问题标题】:Client Credentials Flow or Authorization Code Flow (with PCKE) for a trusted desktop client受信任桌面客户端的客户端凭据流或授权代码流(使用 PCKE)
【发布时间】:2020-10-02 19:12:17
【问题描述】:

我正在为多个 API 开发身份验证/授权架构。

我将 IdentityServer4 用作安全令牌服务 (STS)。

根据我从“Dominick Baier”(构建 IdentitySever4 的人之一)中读到的内容,只有两种类型的流应该使用

  • 客户端凭据流。 (机器对机器)
  • 授权代码流程 + PCKE。 (适用于迭代用户)。

我有几个 C# Web API 将与每个(机器对机器)通信,我将使用客户端凭据流。

但是有一些 WPF 桌面应用程序需要访问一些 API,并且没有用户。 应该使用哪个流程?

我读过: 桌面/本地和移动应用程序应该使用授权代码流授权(使用公共客户端和 PKCE),因为它们托管在客户端,并且客户端/秘密可能会泄露(也许在桌面应用程序上我们可以加密秘密?但是接下来需要管理一种方法来存储解密它的秘密吗?)

然后我读到: “只要您有一个不关心最终用户身份的系统(并且只需要对系统进行身份验证),请使用 OAuth2 客户端凭据授予。”

目前,这是我的情况,我不关心最终用户身份(但也许在不久的将来我会关心)。

因此,由于上述几点相互冲突: - 我应该使用哪个流程? - 我可以拥有一个使用客户端凭据流的桌面客户端并且安全吗?

另外,我读过一些关于 Mutual TLS 的文章,如果我使用它,这会改变我应该使用哪个流程吗?

【问题讨论】:

    标签: c# authentication oauth-2.0 identityserver4 openid-connect


    【解决方案1】:

    您不能信任客户端,因为您无法确定请求来自客户端。还有一个问题是客户不善于保守秘密。但是有不同类型的客户。

    在服务器上运行的客户端通常具有单一任务,例如同步与用户无关的数据,适合使用客户端凭据流。在某种程度上,他们可以保守秘密(在服务器上运行)。

    您可以为每个实例使用唯一的凭据,但这并不能使其更安全。它可以帮助您识别客户端,但不会增加安全性。安全是关于监控行为和检测异常。或者可能通过过滤 IP 地址来缩小访问范围。

    但您不限于使用您提到的两个流程。作为令牌提供者,您可以使用 extension grants 使用自定义流扩展 IdentityServer。

    在没有用户的情况下,客户端凭据有点类似于资源所有者密码凭据 (ROPC) 流程(授权类型文档中不再涵盖但仍然存在的另一个选项,请参阅 old docs)。从两者都可以自动化的意义上说,两者都不是真正安全的。由于这些流程不需要用户交互,因此可以消除用户因素。

    但我想知道为什么您的应用程序没有用户,在用户机器上运行。因为理想情况下,您有一个客户端(没有秘密),用户登录并让客户端联系 api (delegation)。

    所以有两件事:你需要识别客户吗?如果没有,您可以使用 ApiKey,例如发送网格。你永远不能相信客户。安全必须在服务器端。

    所以基本上这并不重要,你无法做任何事情来让它更安全的客户端。您唯一可以做的就是添加用户交互的要求。所以也许现在您不需要它,但它会增加安全性并允许您将 api 访问权限委托给客户端。

    【讨论】:

    • 我暂时没有用户,只是因为我正在重构安全性,而且目前 WPF 没有用户登录的用例,但将来会有添加,以确保更高的安全性,此外,我们可以通过正确的身份进行审核。问题是我需要进行这些更改/重构增量。但是,是的,最后一个场景将是 WPF 客户端上的授权代码流 + PCKE,使用 Gary 提到的系统浏览器。 “你不能信任客户端,因为你不能确定请求来自客户端”,MTLS 不应该确保我可以信任客户端吗?
    【解决方案2】:

    添加到 Ruard 的非常好的答案并为您指出一些链接:

    对于您的 WPF 桌面应用程序,标准技术是打开系统浏览器进行登录,然后在您的应用程序中接收响应。这有点棘手,但下面的 IdentityModel 代码示例显示了如何:

    我的资源

    虽然用户体验有点棘手,所以要了解这种行为,您可能需要查看我的可视化博客文章。

    博客文章附有几个代码示例,您可以在本地 PC 上轻松运行。

    【讨论】:

      猜你喜欢
      • 2017-03-04
      • 1970-01-01
      • 2020-03-01
      • 2020-03-12
      • 2020-09-03
      • 2021-12-22
      • 2014-11-20
      • 2019-12-03
      • 2018-03-13
      相关资源
      最近更新 更多