为了账号安全,请及时绑定邮箱和手机立即绑定

无法从托管服务中的缓存附加身份验证令牌

无法从托管服务中的缓存附加身份验证令牌

C#
大话西游666 2023-09-16 17:37:43
我是 .net 的新手,我真的很想了解应用程序的这种行为。我有一个名为的函数GetOrg(),它基本上请求 API 端点并获取数据,以获取我需要在每个请求中传递身份验证令牌的数据。为了获取身份验证令牌,我有另一个函数调用来GetAccessToken获取令牌并将其保存在缓存中。我创建了一个名称httpclient,它将令牌附加到 NonProductionEnv客户端的每个请求。现在的问题是,当我GetOrg()在托管服务中设置时,如下所示,它不会附加令牌并请求没有身份验证令牌的 API 端点,但如果我GetOrg()在控制器中设置,它就可以正常工作。启动时指定的客户端:    services.AddHttpClient("NonProductionEnv", client =>{    client.BaseAddress = new Uri(Configuration["NonProductionEnvironment:NP_API_URL"]);    client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", (String)_cache.Get("np"));});下面的日志每秒生成一次,因为我需要每秒调用 api 端点。现在正在侦听:https://localhost:5001现在正在侦听: http://localhost:5000应用程序已启动。按 Ctrl+C 关闭。信息:System.Net.Http.HttpClient.NonProductionEnv.LogicalHandler[100] 开始处理 HTTP 请求 GET https://api.sample.io/v3/organizations信息:System.Net.Http.HttpClient.NonProductionEnv.ClientHandler[100]发送 HTTP 请求 GET https://api.sample.io/v3/organizations信息:System.Net.Http.HttpClient.NonProductionEnv.ClientHandler[101] 在 53.3973ms 后收到 HTTP 响应 - 未经授权PS:我不太了解.net 及其工作原理。
查看完整描述

1 回答

?
森林海

TA贡献2011条经验 获得超2个赞

您正在使用应用程序启动时HttpClient从缓存中检索的静态值进行注册。此时,您的托管服务尚未运行,因此缓存中还没有任何价值。一旦缓存中最终有一个值,标头早已被设置,并且您永远不会重置它。


这里实际上完全不需要缓存。您也不需要Authorization在实际的客户端注册中设置标头。相反,只需将您的GetAccessToken方法修改为:


private void GetAccessToken(object state)

{

    Dictionary<string, string> authenticationCredentials_np = Configuration.GetSection("NonProductionEnvironment:Credentials").GetChildren().Select(x => new KeyValuePair<string, string>(x.Key, x.Value)).ToDictionary(x => x.Key, x => x.Value);

    Token token_np = GetToken(new Uri(Configuration["NonProductionEnvironment:URL"]), authenticationCredentials_np).Result;


    _client_NP.DefaultRequestHeaders.Add("Authorization", $"Bearer {token_np.AccessToken}");

}


查看完整回答
反对 回复 2023-09-16
  • 1 回答
  • 0 关注
  • 82 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信