C# 可信桌面客户端的客户端凭据流或授权代码流(带PCKE)

C# 可信桌面客户端的客户端凭据流或授权代码流(带PCKE),c#,authentication,oauth-2.0,identityserver4,openid-connect,C#,Authentication,Oauth 2.0,Identityserver4,Openid Connect,我正在为几个API开发身份验证/授权体系结构 我使用IdentityServer4作为安全令牌服务(STS) 从我从“Dominick Baier”(创建IdentitySever4的人之一)中读到的内容来看,应该使用的流只有两种类型: 客户端凭据流。(机器对机器) 授权代码流+PCKE。(适用于有吸引力的用户) 我有几个C#Web API将与每一个(机器到机器)通信,我将使用客户机凭据流 但是还有一些WPF桌面应用程序,它们需要访问一些API,并且没有用户。 应该使用哪个流 我读过: 桌面

我正在为几个API开发身份验证/授权体系结构

我使用IdentityServer4作为安全令牌服务(STS)

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

  • 客户端凭据流。(机器对机器)
  • 授权代码流+PCKE。(适用于有吸引力的用户)
我有几个C#Web API将与每一个(机器到机器)通信,我将使用客户机凭据流

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

我读过: 桌面/本机和移动应用程序应使用带有授权代码流的授权(使用公共客户端和PKCE),因为它们托管在客户端,并且客户端/机密可能会泄漏(可能在桌面应用程序上,我们可以加密机密?但随后需要管理一种方法,如何存储解密的机密?)

然后我读到: 只要您的系统与最终用户身份无关(只需要对系统进行身份验证),请使用OAuth2客户端凭据授权

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

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


另外,我已经读了一些关于相互TLS的内容,如果我使用它,这会改变我应该使用哪个流吗?

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

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

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

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

没有用户凭据时,客户端凭据与资源所有者密码凭据(ROPC)流有些类似(另一个选项,授权类型文档中不再介绍,但仍然存在,请参阅)。两者都不是真正安全的,因为两者都可以自动化。用户因素可以消除,因为这些流不需要用户交互

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

所以有两件事:你需要识别客户吗?如果没有,您可以使用ApiKey,例如Sendgrid。你永远不能信任客户。安全性必须是服务器端的


所以,基本上这并不重要,您无法使客户端更安全。您唯一能做的就是添加用户交互的需求。因此,现在您可能不需要它,但它将提高安全性,并允许您将api访问委托给客户端。

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

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

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

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

没有用户凭据时,客户端凭据与资源所有者密码凭据(ROPC)流有些类似(另一个选项,授权类型文档中不再介绍,但仍然存在,请参阅)。两者都不是真正安全的,因为两者都可以自动化。用户因素可以消除,因为这些流不需要用户交互

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

所以有两件事:你需要识别客户吗?如果没有,您可以使用ApiKey,例如Sendgrid。你永远不能信任客户。安全性必须是服务器端的


所以,基本上这并不重要,您无法使客户端更安全。您唯一能做的就是添加用户交互的需求。因此,现在您可能不需要它,但它将提高安全性,并允许您将api访问权委托给客户端。

要添加到Ruard的非常好的答案中,并指向以下链接:

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

矿山资源

但是用户体验有点棘手,所以要理解