IdentityServer 动态客户端注册(优缺点)

时间:2021-03-22 20:08:37

标签: c# identityserver4

我计划分发一个二进制包,其功能与 Dropbox/OneDrive/GoogleDrive Windows 应用程序非常相似。它是一个与中央 API 通信的客户端。这确实是一个机器对机器的集成,但只允许某些用户进行配置。

因此,我正在考虑如何解决设置问题,如果 IdentityServer 中应该有不同的客户端。无论哪种方式,都将只允许某些用户配置客户端。

备选方案 1:

只有 一个 客户端注册在 IdentityServer 中,所有安装都使用。授权用户 (ICustomTokenRequestValidator) 在安装 (http://docs.identityserver.io/en/latest/topics/resources.html#parameterized-scopes) 时创建参数化范围(除了 offline_access),然后将包含在请求的访问令牌中。令牌使用例如本地存储https://docs.microsoft.com/en-us/dotnet/api/system.security.cryptography.protecteddata?redirectedfrom=MSDN&view=net-5.0。范围被转换为表示资源访问/范围/租户的声明范围参数可以直接使用。

备选方案 2 (https://tools.ietf.org/html/rfc7591):

客户端是由授权用户动态创建的,例如通过在 IdentityServer 中公开 API( Is there a way to achieve Dynamic Client Registration with IdentityServer?)。允许的范围在创建时定义,客户端使用客户端凭据进行配置 - 就像真正的机器到机器集成。端点使用专门的授权策略进行保护,仅授予某些用户访问权限。

我在这两种选择之间有点左右为难,两者都有优点和缺点,但我更倾向于选择 2。这不需要任何额外的管道(例如 ICustomTokenRequestValidatorIProfileServiceIScopeParser),但可能会导致数据库充满客户端。

这两种选择都允许通过禁用客户端(替代项 2)或调用撤销端点来撤销受损令牌。

我的目标是在多个位置设置一个安全的客户端应用程序,同时最大限度地减少访问令牌被泄露时的访问和后果。

备选方案 3:

这不是动态客户端注册,而是像替代方案 1 一样使用一个客户端。API 使用两个范围进行配置;一个表示操作,例如https://api.myserver.com/op1 和参数化范围,例如租户。第一个范围被配置为包含一个额外的声明,表示 user_level (Authorization based on Scopes),如果用户拥有它,它将被包含在访问令牌中。然后,API 在授予访问权限之前检查操作范围、参数化范围和 user_level 声明是否存在。

上述替代方案是否还有其他替代方案或其他考虑因素、利弊?

0 个答案:

没有答案