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

问题描述 投票:0回答:1

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

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

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

var accessToken = await HttpContext.GetUserAccessTokenAsync();

但是我如何访问服务中的访问令牌?也尝试过此操作,但是没有用

    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);
}
asp.net-core httpcontext
1个回答
0
投票

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

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

[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 HttpContext.GetTokenAsync("access_token");
        request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", token);
        return await base.SendAsync(request, cancellationToken);
    }
}

有关IHttpClientFactory的更多信息,您可以看到this article

© www.soinside.com 2019 - 2024. All rights reserved.