c# - 受信任桌面客户端的客户端凭据流或授权代码流(使用 PCKE)
问题描述
我正在为多个 API 开发身份验证/授权架构。
我使用 IdentityServer4 作为安全令牌服务 (STS)。
根据我从“Dominick Baier”(构建 IdentitySever4 的人之一)中读到的内容,只有两种类型的流应该使用:
- 客户凭证流。(机器对机器)
- 授权码流程 + PCKE。(对于迭代用户)。
我有几个 C# Web API 将与每个(机器对机器)通信,我将使用客户端凭据流。
但是有一些 WPF 桌面应用程序需要访问一些 API,并且没有用户。应该使用哪个流?
我读过:桌面/本机和移动应用程序应该使用授权和授权代码流(使用公共客户端和 PKCE),因为它们托管在客户端,并且客户端/秘密可能会被泄露(可能在桌面上应用程序我们可以加密秘密吗?但是需要管理一种方法来存储解密的秘密吗?)
然后我读到:“只要您有一个不关心最终用户身份的系统(并且只需要对系统进行身份验证),请使用 OAuth2 客户端凭据授予。”
目前,这是我的情况,我不关心最终用户的身份(但也许在不久的将来我会关心)。
因此,由于上述几点相互冲突: - 我应该使用哪个流程?- 我可以拥有使用客户端凭据流的桌面客户端并且安全吗?
另外,我读过一些关于 Mutual TLS 的文章,如果我使用它,这会改变我应该使用哪个流程吗?
解决方案
您不能信任客户端,因为您无法确定请求来自客户端。还有一个问题是客户不善于保守秘密。但是有不同类型的客户。
在服务器上运行的客户端通常具有单个任务,例如同步与用户无关的数据,适合使用客户端凭据流。在某种程度上,他们可以保守秘密(在服务器上运行)。
您可以为每个实例使用唯一凭据,但这并不能使其更安全。它可以帮助您识别客户端,但不会增加安全性。安全是关于监控行为和检测异常。或者可能通过过滤 IP 地址来缩小访问范围。
但是您不限于使用您提到的两个流程。作为令牌提供者,您可以使用扩展授权扩展 IdentityServer 和自定义流。
如果没有用户,客户端凭据有点类似于资源所有者密码凭据 (ROPC) 流程(授权类型文档中不再涵盖但仍然存在的另一个选项,请参阅旧文档)。从两者都可以自动化的意义上说,两者都不是真正安全的。由于这些流程不需要用户交互,因此可以消除用户因素。
但我想知道为什么您的应用程序没有用户,在用户机器上运行。因为理想情况下,您有一个客户端(没有秘密),用户在其中登录并让客户端联系 api(委托)。
所以有两件事:你需要识别客户吗?如果没有,您可以使用 ApiKey,例如 Sendgrid。你永远不能相信客户。安全必须是服务器端。
所以基本上这并不重要,你无法做任何事情来让它更安全的客户端。您唯一可以做的就是添加用户交互的要求。所以也许现在您不需要它,但它会增加安全性并允许您将 api 访问委托给客户端。
推荐阅读
- angular - angular 6 bootstrap 如何在组件模板中将宽度设置为 td 表
- python - Scraper 未提取 url 链接:
- c - 确定用户输入值的数据类型
- python - 从另一个类访问实例变量
- java - 如何从可执行文件加载我的本地主机 java spring boot web 应用程序
- java - 将json字符串转换为日期对象
- google-maps - 如何添加路线图和交通图层
- c++ - 这行 else if(open_nodes_map[xdx][ydy]>m0->getPriority()) 是什么意思?
- c++ - 在 Set/Map 中使用向量作为键的 C++ 不会产生唯一答案
- mysql - 如何删除联合表与连接表之间的匹配项