如何使用HttpClient从IHttpClientFactory向请求添加Cookie [英] How to add a cookie to a request using HttpClient from IHttpClientFactory

查看:0
本文介绍了如何使用HttpClient从IHttpClientFactory向请求添加Cookie的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

背景
我正在开发一个ASP.NET Core Web API,其中我们在API中调用第三方API。此第三方API要求每个请求都包含带有访问令牌的Cookie。我们的API从声明(从与请求相关联的用户的ClaimsPrincipal)获取该令牌。

详细信息
This answer显示如何在请求上设置cookie,但该示例需要手动构造HttpClient(以便能够使用CookieContainer注入HttpClientHandler)。由于不希望手动实例化HttpClient,我宁愿通过this example说明的DI注入HttpClient

在我的服务中,我可以访问一个注入的HttpClient实例(_httpClient),最简单的函数如下所示:

public async Task<string> GetStatusAsync(ClaimsPrincipal user)
{
    // TODO: Add cookie with access token (from user's claims) before making request
    return await _httpClient.GetStringAsync(Endpoints.Status);
}

This GitHub issue询问使用IHttpClientFactory时如何包含授权cookie,答案是use the header propagation middleware。现在来谈谈我的问题:

在我看来,您在应用程序启动时的服务配置期间设置了头传播中间件(具有所有头和Cookie等)。但是,在我们的API中,在实际向第三方API发出请求之前,我没有身份验证Cookie的值。

问题
如何在发出实际请求之前使用IHttpClientFactory将Cookie添加到HttpClient实例上的请求?

推荐答案

解决方案确实是使用header propagation。我只需要把所有的东西都正确地组合在一起。

头部传播配置在ConfigureServices内部(在Startup.cs中)。由于我希望使用来自当前用户声明的数据,因此在添加Cookie标头时,诀窍是在接受允许您访问当前上下文的函数的重载中使用:

services.AddHeaderPropagation(options =>
{
    options.Headers.Add("Cookie", context =>
    {
        var accessToken = context.HttpContext.User.Claims.FirstOrDefault(c => c.Type == "access-token")?.Value;
        return accessToken != null ? new StringValues($"token={accessToken}") : new StringValues();
    });
});

除此之外,由于我使用Typed Service,我还必须配置该特定服务应该转发Cookie标头(在Startup.csConfigureServices中相同位置):

services.AddHttpClient<IApiService, ApiService>(httpClient =>
{
    httpClient.BaseAddress = new Uri("https://httpbin.org/");
}).AddHeaderPropagation(options =>
{
    options.Headers.Add("Cookie");
});

最后,有一件事给我带来了一些麻烦:因为我使用的是来自当前用户的数据,所以必须在添加身份验证中间件(app.UseAuthentication();)之后注册头传播中间件(app.UseHeaderPropagation();内部Startup.cs)。如果不是,则尚未设置声明。

作为最后一个提示:我在https://httpbin.org/中工作时很棒。那里的请求检查端点对于查看您的请求中实际传递了哪些数据非常有用。

这篇关于如何使用HttpClient从IHttpClientFactory向请求添加Cookie的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆