无头桌面客户端Web服务客户端应该是动态注册的OIDC客户端 - 还是其他什么?

问题描述 投票:0回答:1

我的设置如下:

  • 这是一个多租户系统,因此用户声明集包括tenant_id,它唯一地标识用户所属的租户。
  • 基于IdentityServer4的Web服务(提供OAuth2 / OpenID Connect服务):https://identity.example.com
  • 一个单独的Web服务(RESTful web-api):https://random-number-generator-service.example.com
  • 无头程序(Windows服务),可在许多位置的本地计算机上运行:RandomNumberConsumer.exe。该程序在random-number-generator-service的上下文中使用tenant_id,因此用户需要在某种程度上以某种方式进行身份验证,否则程序不关心用户的详细信息,只关心用户的租户的详细信息。

我明白这意味着random-number-generator-serviceRandomNumberConsumer.exe都是“客户”。

在IdentityServer中,必须注册所有客户端软件(静态地作为Client对象实例的硬编码列表或使用数据库进行某种动态注册来存储客户端详细信息。显然random-number-generator-service将具有静态注册,但RandomNumberConsumer.exe应该如何注册?

一些选择:

  1. 添加一个新的Web应用程序,用户可以使用Web浏览器登录并注册他们的RandomNumberConsumer.exe安装(在Client的客户端数据库中添加新的identity.example.com注册,完成客户端密码)然后用户手动复制并粘贴客户端密钥进入RandomNumberConsumer.exe的配置文件。内部数据库使用tenant_id映射每个客户端注册。这具有允许单个客户端访问撤销的优点,但是要求用户执行不期望的手动配置步骤。
  2. 在没有任何客户端密钥的情况下为RandomNumberConsumer.exe进行单个客户端注册,但客户端应用程序需要一个GUI组件,可以使用该组件对用户进行身份验证,并将用户关联的access_tokenrefresh_token存储在其本地配置中。这样做的好处是具有更简单的用户体验(因为用户可以打开RandomNumberConsumerConfiguration.exe程序,然后打开Web浏览器访问身份验证页面并使用带有临时redirect_uri或自定义URI方案值的localhost获取数据)但这意味着当我们只希望它与租户相关联时,RandomNumberConsumer.exe实例与个人用户相关联。

还有其他方法可以替代使用吗?

oauth-2.0 identityserver4 openid-connect
1个回答
1
投票

客户端的每个实例都应该拥有自己的id。 random-number-generator-service应该有一个id(即使它在Web场中运行)。

RandomNumberConsumer.exe安装在域外的不同计算机上,因此每个安装应具有唯一的ID。

客户端与用户无关,因为缺少子索赔。客户包含子索赔的唯一时间是它代表(并征得用户同意)的行为。这可能是random-number-generator-service的情况,但不适用于没有用户交互的RandomNumberConsumer.exe(因为它是Windows服务),并且当用户请求安装时不需要同意。

当您谈论Windows服务时,配置服务是不可避免的。但是,您可以在安装程序中实现配置步骤。因此,您可以采用以下方法,而不必构建UI或破解配置文件:

  1. 用户请求安装程序。批准后,将根据用户创建客户端并将其附加到租户(ClientClaims)。
  2. 用户开始下载安装程序并接收id / secret(在屏幕上,电子邮件)。
  3. 用户开始安装,并在用户必须输入id / secret的步骤之一。这是可以接受的,因为它在安装软件时很常见。

这具有您想要的优点,并且从用户那里获得最少的步骤。

如果服务具有更多配置选项,并且您希望为用户提供维护选项的UI,则将配置程序添加到安装程序。这对于路由器和打印机来说非常普遍。用户无需登录,因为它在本地运行(localhost网站)。您可以为浏览器添加链接作为快捷方式。

© www.soinside.com 2019 - 2024. All rights reserved.