如何在 .net core 的服务中获取访问令牌?
How to get the access token in a service in .net core?
我有一个应用程序,我想使用混合流从我的 MVC Web 应用程序调用 API。 API 是安全的,需要访问令牌 (JWT)。 API这边的代码部分就完成了。
但是如何将我的访问令牌从我的 MVC 应用程序发送到服务中的 API?我想为此使用一个使用 httpclient 的 "generic" 服务。
我知道您可以在控制器中使用
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);
}
如果您使用的是 IHttpClientFactory
,您可以通过在 Startup.cs 中添加 DelegatingHandler
来配置 HttpClient
:
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 _httpContextAccessor.HttpContext.GetTokenAsync("access_token");
request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", token);
return await base.SendAsync(request, cancellationToken);
}
}
有关IHttpClientFactory
的更多信息,您可以查看this article。
我有一个应用程序,我想使用混合流从我的 MVC Web 应用程序调用 API。 API 是安全的,需要访问令牌 (JWT)。 API这边的代码部分就完成了。 但是如何将我的访问令牌从我的 MVC 应用程序发送到服务中的 API?我想为此使用一个使用 httpclient 的 "generic" 服务。
我知道您可以在控制器中使用
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);
}
如果您使用的是 IHttpClientFactory
,您可以通过在 Startup.cs 中添加 DelegatingHandler
来配置 HttpClient
:
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 _httpContextAccessor.HttpContext.GetTokenAsync("access_token");
request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", token);
return await base.SendAsync(request, cancellationToken);
}
}
有关IHttpClientFactory
的更多信息,您可以查看this article。