Asp.net core 使用IHttpClientFactory使用外部API时存储访问和刷新令牌的位置。网芯

Asp.net core 使用IHttpClientFactory使用外部API时存储访问和刷新令牌的位置。网芯,asp.net-core,token,refresh-token,httpclientfactory,Asp.net Core,Token,Refresh Token,Httpclientfactory,我正在使用IHttpClientFactory使用netcore2.2从我的Web API向外部API发送请求和接收HTTP响应 用于向API发送请求的访问令牌和刷新令牌已存储在appsettings.json中。当请求返回403或401错误时,我会动态地获取一个新令牌,并将其添加到请求的头中 但如何使用新的访问和刷新令牌更新appsettings.json,以便在后续请求中使用它呢 是否有比appsettings.json更好的存储访问和刷新令牌的方法 假设您的客户端WEB API自动连接到外

我正在使用IHttpClientFactory使用netcore2.2从我的Web API向外部API发送请求和接收HTTP响应

用于向API发送请求的访问令牌和刷新令牌已存储在appsettings.json中。当请求返回403或401错误时,我会动态地获取一个新令牌,并将其添加到请求的头中

但如何使用新的访问和刷新令牌更新appsettings.json,以便在后续请求中使用它呢


是否有比appsettings.json更好的存储访问和刷新令牌的方法

假设您的客户端WEB API自动连接到外部API(并且自动询问令牌),您不需要存储令牌和刷新令牌

您的Web服务需要将令牌保存在内存中(在单例中),并在需要时使用它

当外部API需要一个新的令牌时(例如,在令牌到期后),您只需要请求一个新的令牌并更新您的singleton


我们在几个项目中使用这种工作方式,它是可靠的。

因为您使用的是
IHttpClinetFactory
(假设您也在使用),您可以创建自己的,在您的
类型化客户机发出任何请求之前触发,并通过DI将其与您的
类型化客户机链接,如下所示:

services.AddHttpClient()
.AddHttpMessageHandler();
在该
TokenHandler
中,您可以检查请求头中是否有令牌。如果没有,请检查缓存(内存缓存)中是否有可用的令牌,然后验证令牌的生存期

如果令牌已过期或缓存中没有此类令牌,请发出新令牌并将其存储在缓存中

我相信有更好的方法,但我会这么做


注意:如果您的应用程序分布在多个服务器上,则使用而不是。您可以通过DI轻松地添加任何一个


更新:

您可以按如下方式注册处理程序:

services.AddTransient();

通常,您应该将令牌存储在数据库中,以便EF Core或任何其他数据提供商永久保存

如果坚持保存在
appsettings.json
中,则需要实现自定义功能


有关演示,请检查

让我看看我是否理解这一点。当向我的AP发送请求时,我会正确创建WebAPi控制器,然后当向客户端发送响应时,控制器会被销毁,这意味着内存中的令牌不再可用,对吗?。这意味着对于每个后续请求,我都需要请求一个新的令牌。我试图将上一个请求得到的令牌存储在appsettings.json中,以便新请求可以使用它。您需要将令牌存储为singleton。当您的控制器被销毁时,它不会被销毁,而是当您的应用程序关闭时(然后令牌归您的程序所有)请举例说明如何将令牌存储为单例。如果您没有在此单例上实现正确的锁定,这可能会导致灾难。我假定您在获取访问令牌时使用的是
Auth Flow
。能否在启动文件中共享ConfigureServices代码?通常,您可以将令牌存储在cookie中。存储在appsettings.json中不是一个好主意。谢谢。我会考虑你的建议。提供的链接很棒。嘿,我知道这已经有一年了,但我也在尝试做同样的事情,刷新带有标题的令牌。我创建了一个类TokenHandler,它实现了委托处理程序,并将其链接到我的类型化HttpClient上,如上面的示例所示。如果您能帮助我,我想知道TokenHandler需要如何注册,因为我得到了一个“没有为TokenHandler类型注册服务”错误。如果您能帮我做这件事,我将非常感谢您没有提供注册示例,您可以将
处理程序注册为transient
services.AddTransient()