繁体   English   中英

ASP.NET 内核 Web API - JWT 注册类型消息处理程序

[英]ASP.NET Core Web API - JWT Message Handler - No Registered Type Error

我为我的 Web API 项目创建了一个 JWT 令牌处理程序。 这个想法是,这个 API 只是通往其他 API 的网关,并且在它们之间共享一个令牌。 因此,当对我的 API 进行呼叫并将呼叫转发给另一个时,我想自动转发附加到初始请求的 JWT。

我制作了一个自定义 MessageHandler ,如下所示:

public class JwtTokenHeaderHandler : DelegatingHandler
{
    private readonly HttpContext httpContext;
   public JwtTokenHeaderHandler(HttpContext httpContext)
   {
       this.httpContext = httpContext;
   }
   protected override async Task<HttpResponseMessage> SendAsync(
       HttpRequestMessage request,
       CancellationToken cancellationToken)
   {
       string savedToken = await this.httpContext.GetTokenAsync("access_token");
       request.Headers.Add("bearer", savedToken);
       return await base.SendAsync(request, cancellationToken);
   } 
}

然后我在 Startup 中将其注册为服务,如下所示:

services.AddTransient<HttpMessageHandler>(p => p.GetRequiredService<JwtTokenHeaderHandler>());

IHttpClientBuilder serviceClientBuilder = services.AddHttpClient<IService, Service>(client =>
{
    client.BaseAddress = new Uri(this.Configuration.GetValue<string>("ServiceURL"));
}).AddHttpMessageHandler<JwtTokenHeaderHandler>();

应用程序一直运行,直到发出请求,然后出现此异常:

执行请求时发生未处理的异常。

System.InvalidOperationException:未注册“Application.API1.JwtTokenHeaderHandler”类型的服务。 在 Microsoft.Extensions.DependencyInjection.ServiceProviderServiceExtensions.GetRequiredService(IServiceProvider provider, Type serviceType) 在 Microsoft.Extensions.DependencyInjection.ServiceProviderServiceExtensions.GetRequiredService[T](IServiceProvider provider) 在 Microsoft.Extensions.DependencyInjection.HttpClientBuilderExtensions.<>c__4`1.b__4_1 (HttpMessageHandlerBuilder b) 在 Microsoft.Extensions.Http.DefaultHttpClientFactory.<>c__DisplayClass17_0.g__Configure|0(HttpMessageHandlerBuilder b) 在 Microsoft.Extensions.Http.LoggingHandlerBuilder HttpMessageHandlerBuilder0__(HttpMessageHandlerBuilder)0(HttpMessageHandlerBuilder)0

首先,直接注入HttpContext会导致问题。 使用IHttpContextAccessor并在 Send 方法中访问上下文。

public class JwtTokenHeaderHandler : DelegatingHandler {
    private readonly IHttpContextAccessor accessor;

    public JwtTokenHeaderHandler(IHttpContextAccessor accessor) {
        this.accessor = accessor;
    }

    protected override async Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken) {
        string savedToken = await accessor.HttpContext.GetTokenAsync("access_token");
        request.Headers.Add("bearer", savedToken);
        return await base.SendAsync(request, cancellationToken);
    } 
}

Next GetRequiredService在请求的服务未向集合注册时抛出该异常,因此请确保向容器注册处理程序

笔记

处理程序类型必须注册为临时服务。

参考AddHttpMessageHandler<THandler>(IHttpClientBuilder)

services.AddTransient<JwtTokenHeaderHandler>();

这样JwtTokenHeaderHandler可以在服务提供者请求时解析

services.AddTransient<HttpMessageHandler>(p => p.GetRequiredService<JwtTokenHeaderHandler>());
services.AddHttpClient<IService, Service>(client => {
    client.BaseAddress = new Uri(this.Configuration.GetValue<string>("ServiceURL"));
}).AddHttpMessageHandler<JwtTokenHeaderHandler>();

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM