如何在ASP.NET Core Web API中实现类Angular HttpInterceptor的JWT拦截器?
在ASP.NET Core Web API中实现自动添加JWT Token的请求拦截器
完全可以实现,ASP.NET Core提供的DelegatingHandler机制和Angular的HttpInterceptor作用逻辑一致,能拦截所有通过HttpClient发起的请求,自动为请求头添加JWT Token,非常适配微服务间的调用场景。
具体实现步骤
1. 创建自定义请求拦截Handler
创建继承自DelegatingHandler的类,重写SendAsync方法,在请求发送前注入JWT Token:
public class JwtTokenHandler : DelegatingHandler { private readonly IConfiguration _configuration; // 示例从配置文件读取Token,实际可根据场景从Token服务、缓存等动态获取 public JwtTokenHandler(IConfiguration configuration) { _configuration = configuration; } protected override async Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken) { var jwtToken = _configuration["ServiceAuth:JwtToken"]; if (!string.IsNullOrWhiteSpace(jwtToken)) { request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", jwtToken); } return await base.SendAsync(request, cancellationToken); } }
2. 将Handler注册到依赖注入容器
在Program.cs中完成Handler的注册,并配置HttpClient绑定该拦截逻辑:
var builder = WebApplication.CreateBuilder(args); // 注册自定义JWT拦截Handler为单例 builder.Services.AddSingleton<JwtTokenHandler>(); // 配置专属HttpClient,绑定拦截Handler builder.Services.AddHttpClient("MicroServiceClient") .AddHttpMessageHandler<JwtTokenHandler>(); // 其他服务与中间件配置... var app = builder.Build(); app.Run();
3. 使用配置好的HttpClient发起微服务调用
在业务类中注入IHttpClientFactory,获取配置好的HttpClient即可自动携带Token:
public class OrderServiceClient { private readonly HttpClient _httpClient; public OrderServiceClient(IHttpClientFactory httpClientFactory) { _httpClient = httpClientFactory.CreateClient("MicroServiceClient"); } public async Task<OrderDto> GetOrderAsync(int orderId) { // 请求会自动携带Authorization头,无需手动设置 var response = await _httpClient.GetAsync($"https://order-service/api/orders/{orderId}"); response.EnsureSuccessStatusCode(); return await response.Content.ReadFromJsonAsync<OrderDto>(); } }
扩展说明
- 若需动态刷新Token,可在
JwtTokenHandler中集成Token获取与缓存逻辑,比如调用身份服务的刷新接口更新Token。 - 可添加过滤逻辑,仅对特定域名、路径的请求添加Token,避免无意义的处理。
- 若是转发前端请求的用户Token,可从
HttpContext中提取当前用户的Token并注入到请求头。
内容的提问来源于stack exchange,提问作者Abir Mahmud
相关产品推荐
相关产品推荐

