Asp.net core 如何在.net core中的服务中获取访问令牌?
我有一个应用程序,我想使用混合流从我的MVC web应用程序调用API。API是安全的,需要访问令牌(JWT)。API端的代码部分已经完成。 但是如何将访问令牌从MVC应用程序发送到服务中的API?我想使用一个使用httpclient的“通用”服务 我知道在控制器中你可以使用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
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);
}
}