流动客户端主题时如何在 C# HttpClient 中设置 OIDC/OAuth 不记名令牌

Posted

技术标签:

【中文标题】流动客户端主题时如何在 C# HttpClient 中设置 OIDC/OAuth 不记名令牌【英文标题】:How to set OIDC/OAuth bearer token in C# HttpClient when flowing client subject 【发布时间】:2017-02-14 10:58:11 【问题描述】:

据我了解,HttpClient 旨在创建一次并重复使用。我使用 IdentityServer3 作为 OIDC/OAuth 服务器,我查看的示例为每个请求创建一个 HttpClient 并使用扩展方法设置承载令牌:

var client = new HttpClient();
client.SetBearerToken(token);

SetBearerToken 只是在 HttpClient 上设置默认授权标头:

client.DefaultRequestHeaders.Authorization = 
                new AuthenticationHeaderValue("Bearer", token);

我有一个调用 ASP.NET Web API 的 ASP.NET Web 应用程序,并且我已经对其进行了配置,以便在进行调用时(即配置我设置的 OpenId 连接身份验证时)客户端身份流向 API:

OpenIdConnectAuthenticationOptions.ResponseType = "id_token token"

但是,如果主题声明在令牌中传递,我现在无法重用 HttpClient(例如,在另一个请求发送之前,请求可能会覆盖其授权标头)。

如果我想重用 HttpClient,我应该将令牌设置为 HttpRequestMessage 吗?如果不是,处理这种情况的推荐模式是什么?

【问题讨论】:

【参考方案1】:

您肯定想创建自己的HttpRequestMessage 并使用SendAsync。不幸的是,您将没有设置不记名令牌的扩展方法,但它是处理 HttpClient 的最佳方法。

【讨论】:

我怀疑这就是答案。我正在使用 HttpClientExtensions,所以我可以使用 HttpClient.PostAsJsonAsync。是否有具有类似 JSON 处理扩展方法的 HttpRequestMessageExtensions 或者我必须自己推出? 恐怕不是我在正规图书馆见过的。到目前为止,每个人都被困在StringContent 中使用序列化 JSON 编写自己的样板。

以上是关于流动客户端主题时如何在 C# HttpClient 中设置 OIDC/OAuth 不记名令牌的主要内容,如果未能解决你的问题,请参考以下文章

C#中HttpClient使用注意:预热与长连接

修改每个请求的请求标头 C# HttpClient PCL

使用 C# HttpClient API 和 postman 测试的区别?客户端调用适用于邮递员,但不适用于 C# httpClient getAsync

如何删除 HttpClient 请求标头 C# 中的默认字符集

C#中HttpClient使用注意:预热与长连接

C# 9+ 中的 HttpClient 空警告