如何在所有页面上为我的 HttpClient 设置授权 Header?

How do I set Authorization Header for my HttpClient across all pages?

在成功登录的登录页面中联系 API 后,我收到了一个 JWT。我想设置授权Header ONCE 以在浏览时跨所有页面使用。

我不确定是否可以在 HttpClient(使用 ClientFactory)上使用依赖注入来做到这一点? IE。登录成功后,构造函数注入HttpClient并设置授权header,是否保存授权header的状态以供所有页面使用? (我试过了,但对我不起作用,但也许我做错了。)

或者我是否需要在所有页面周围传递 JWT-string 并在每次切换到新页面时设置授权 Header?要进行任何 API 调用,每次我调用授权 API 时设置这似乎很奇怪?哪种方法最好?

这是我的 .NET MAUI 项目(主要是 Xamarin,但较新)。

最佳方法在很大程度上取决于您的实施细节。如果 API 键不可用或变得无效会怎样?您是为对客户端的任何调用管理单个 API 密钥,还是为不同范围或多个用户管理多个 API 密钥?

一种方法是使用 HttpClientFactory 构建类型化客户端;类型化的客户端允许您编写自定义 class,工厂为其注入和管理 HttpClient 实例,并且您可以为其编写客户端需要的特定行为,例如处理 API 键通过依赖注入检查和存储。您可以编写一个名为 IAuthenticatedClient / AuthenticatedClient 的 interface/implementation 来公开诸如 UpdateKey()SendAuthenticatedAsync() 之类的方法,其中这些方法位于持久性存储之上,例如in-memory 保留 API 键的缓存或数据库,并在调用通过 HttpClient 发送之前将其应用于调用,然后使用 services.AddHttpClient<IAuthenticatedClient, AuthenticatedClient>(); 注册并将其注入到您需要的位置。

https://docs.microsoft.com/en-us/aspnet/core/fundamentals/http-requests?view=aspnetcore-6.0#typed-clients

您还可以考虑通过使用附加到命名或类型化客户端的委托处理程序来实现 cross-cutting 问题,例如 API 关键应用程序,这是 Microsoft 文档中描述的情况之一.可以附加多个处理程序来为通过 HttpClient 发送的出站请求和响应创建中间件管道,以处理 headers、日志记录、错误处理、密钥管理等事情

https://docs.microsoft.com/en-us/aspnet/core/fundamentals/http-requests?view=aspnetcore-6.0#outgoing-request-middleware