多个并发请求之间的令牌共享 C#

Token Sharing between multiple concurrent requests C#

我有一个应用程序 (A),多个用户可以通过它登录。用户名和密码,并接收用于后续请求的令牌。如果他们的令牌过期,他们可以得到一个新的。这一切都很好。现在的问题是有时 App (A) 需要通过访问 App (B)。 API-调用本身也需要一个(单独的)令牌。无论哪个客户端发出调用,从 A 到 B 的调用都需要使用相同的令牌。换句话说 - 应用程序 B 不需要知道哪个客户端发出呼叫,它只是将每个呼叫视为应用程序 A 的呼叫。

我的问题在于以线程安全的方式生成和刷新 TokenB。假设 TokenB 已过期,C1、C2、C3 都在同一时间进行调用。当然应该只生成一个新令牌。

我认为这是一个很常见的障碍,但我真的找不到关于线程安全令牌(重新)生成这一特定主题的任何指南。

顺便说一下,应用程序 A 是用 C# 编写的。这与问题无关紧要,但也许 Microsoft 对此有解决方案。

问得好,在 OAuth 客户端中处理令牌刷新很棘手。有两种常用的技术。我更喜欢其中的第二个,因为它更可靠,但它需要更复杂的代码:

  • App A 在后台计时器线程上定期刷新 TokenB,以防止 401s
  • App A 通过令牌刷新处理 401,然后重试对 App B 的请求

同步令牌刷新

一种常见的技术可以是使客户端代码从外部看起来很简单:

var data = await myApiClient.getData();

但是在需要刷新令牌时,您在实现中的某个地方使用了一组回调。其中第一个进行实际的刷新调用,当它完成时,它会解析所有其他具有相同结果的回调。

示例代码

这是一些处理并发的动态令牌刷新的 TypeScript 代码。在 C# 中,您可以对任务做同样的事情,并且您的回调处理需要是线程安全的: