Asp.net core 如何在.net core中的服务中获取访问令牌?

Asp.net core 如何在.net core中的服务中获取访问令牌?,asp.net-core,httpcontext,Asp.net Core,Httpcontext,我有一个应用程序,我想使用混合流从我的MVC web应用程序调用API。API是安全的,需要访问令牌(JWT)。API端的代码部分已经完成。 但是如何将访问令牌从MVC应用程序发送到服务中的API?我想使用一个使用httpclient的“通用”服务 我知道在控制器中你可以使用 var accessToken = await HttpContext.GetTokenAsync("access_token"); 或 但是如何访问服务中的访问令牌? 我也试过了,但没用 var acces

我有一个应用程序,我想使用混合流从我的MVC web应用程序调用API。API是安全的,需要访问令牌(JWT)。API端的代码部分已经完成。 但是如何将访问令牌从MVC应用程序发送到服务中的API?我想使用一个使用httpclient的“通用”服务

我知道在控制器中你可以使用

var accessToken = await HttpContext.GetTokenAsync("access_token");  

但是如何访问服务中的访问令牌? 我也试过了,但没用

    var accessToken = _httpContextAccessor.HttpContext.Request.Headers[HeaderNames.Authorization];
附带问题:如何在服务的构造函数中设置httpclient的访问令牌?(使用异步方法是不可能的)因此我不能使用:

protected HttpClient HttpClient { get; private set; }

public MyGenericHttpClientService(IHttpContextAccessor httpContextAccessor)

{
            var accessToken = await httpContextAccessor.HttpContext.GetTokenAsync("access_token");
            HttpClient.SetBearerToken(accessToken);
}

如果您使用的是
IHttpClientFactory
,则可以通过在Startup.cs中添加
DelegatingHandler
来如下配置
HttpClient

services.AddTransient<TokenHandler>();
services.AddHttpClient().AddHttpMessageHandler<TokenHandler>();

有关
IHttpClientFactory
的详细信息,请参见。

为什么IHttpContextAccessor不起作用?无法在构造函数中使用该函数,因为它是异步的。我可以在每个方法之前都这样做,但想知道是否有更好的方法来解决此问题。您是如何解决HttpClient的?如果您使用的是IHttpClientFactory,则可以在启动时配置一个DelegatingHandler,从IHttpContextAccessor获取令牌,并将其设置为传出请求。请参阅下面的答案
services.AddTransient<TokenHandler>();
services.AddHttpClient().AddHttpMessageHandler<TokenHandler>();
public class TokenHandler : DelegatingHandler
{
    private readonly IHttpContextAccessor _httpContextAccessor;

    public TokenHandler(
        IHttpContextAccessor httpContextAccessor)
    {
        _httpContextAccessor = httpContextAccessor;
    }

    protected override async Task<HttpResponseMessage> SendAsync(HttpRequestMessage request,
        CancellationToken cancellationToken)
    {
        var token = await _httpContextAccessor.HttpContext.GetTokenAsync("access_token");
        request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", token);
        return await base.SendAsync(request, cancellationToken);
    }
}