IdentityServer4 个人访问令牌(类似 github)或第三方客户端的 API 密钥

urb*_*sky 6 authentication api-key openid-connect identityserver4

我们目前的设置是

  • 身份服务器4
  • Angular + ASP.NET Core 应用程序
  • 通过隐式 flow/oidc 对应用程序进行身份验证。

我们希望为客户(即第三方客户)提供访问受限(单独的声明集/子集)的 API。这些客户端大多是下载数据的非交互式脚本。

这意味着我们不能使用任何(偶尔)需要用户交互的流程。个人访问令牌,如在 github 中,或其他一些生成一次,需要长时间重用API 密钥或令牌。

长令牌生命周期不会是一个安全问题,因为令牌应该只允许访问少数只读 API 并且只允许访问该客户的数据 - 因此处理令牌的责任落在了客户身上。

客户应该能够根据他们的声明创建和撤销此类 API 访问令牌。一些用户可能只声称访问某些 API。

如果我们以后可以防止用户因为许可要求而对多个客户端重复使用相同的令牌,那将会很好,但这可能是一个全新的问题

我怎么能做到这一点?

我想通过自定义授权来做到这一点,类似于委托授权:用户使用应用程序,它调用 asp.net 核心 API,使用该自定义授权执行身份验证,将该令牌保留在某处(只是数据库中的一个普通表)仅限客户 api 的令牌?我不确定)并将其显示给用户 - 用户也可以稍后从存储中检索它。

我正在考虑通过我们的 API 进行“委托”身份验证,这样我们就不会将机密泄露到 Angular 应用程序中。

我认为我们应该能够通过该自定义授权获得长期访问令牌或至少刷新令牌。

2017-12-12 我觉得我怎么解决

我们想要一个过程,用户在我们的应用程序中生成一些东西(即通过我们的客户端),然后用户的第三方客户端可以使用这些东西来访问 API - 或者请求访问令牌然后访问 API。

我们希望此访问与用户相关联。这包括 - 残疾用户 - 锁定 - 特定索赔(例如租户)

这并不适合直接发布访问令牌的解决方案,因为即使用户被禁用或锁定,令牌仍将保持有效。这意味着我们不能使用自定义授权或IdentityServerTools直接发行代币。

因此,我们应该使用客户端凭据授权或类似的东西,因为这可能会产生新的、短期的访问令牌。

  • 用户实际上生成了一个新的客户端,它预先填充了来自用户的声明(例如租户 - 这是不可变的),并且具有与用户对应的声明。这透明地发生。密码应由用户提供,并带有更改密码的选项。我们只存储用户和发布的客户端 ID 之间的关系,没有密码。
  • 我们必须创建一个自定义授权,它的工作原理类似于客户端凭据,但还要检查相应的用户是否处于活动状态等(我认为应该可以通过注入UserManager
  • 结果访问令牌的生命周期很短,与我们的 API 的交互预计将是短暂的。

假设写这样的资助足够安全和​​容易,我们应该能够涵盖我们需要的一切。当然,我可能完全忽略了一些东西:)