首页 > 解决方案 > 多个并发请求之间的令牌共享 C#

问题描述

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

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

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

应用程序 A 是用 C# 编写的。并不是说它对这个问题很重要,但也许微软对此有解决方案。

在此处输入图像描述

标签: c#securityconcurrencyaccess-token

解决方案


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

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

同步令牌刷新

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

var data = await myApiClient.getData();

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

示例代码

这是一些处理并发进行中令牌刷新的 TypeScript 代码。在 C# 中,您可以对任务执行等效的操作,并且您的回调处理需要是线程安全的:


推荐阅读