我有一个应用程序,我想使用混合流从我的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);
}
答案 0 :(得分:1)
如果您使用的是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。