如何修复AspNetCore.Authentication.JwtBearer中的“操作被取消”?

时间:2019-07-11 08:15:36

标签: c# .net asp.net-core

我使用Microsoft.AspNetCore.Authentication.JwtBearer,版本= 2.1.2.0对ASP.NET Core 2.1应用程序中的请求进行身份验证。该应用程序已部署在Linux Docker映像中的Kubernetes集群上。身份验证服务器在群集外部。

有时(很少),当JwtBearer软件包需要刷新auth众所周知的配置时,会引发OperationCanceledException。异常表明无法从SemaphoreSlim类获取锁。

我们如何避免这个问题?

错误堆栈跟踪为

fail: Microsoft.AspNetCore.Server.Kestrel[13]
      Connection id "0HLNVLH85GSDG", Request id "0HLNVLH85GSDG:00000002": An unhandled exception was thrown by the application.
System.OperationCanceledException: The operation was canceled.
   at System.Threading.CancellationToken.ThrowOperationCanceledException()
   at System.Threading.SemaphoreSlim.WaitUntilCountOrTimeoutAsync(TaskNode asyncWaiter, Int32 millisecondsTimeout, CancellationToken cancellationToken)
   at Microsoft.IdentityModel.Protocols.ConfigurationManager`1.GetConfigurationAsync(CancellationToken cancel)
   at Microsoft.AspNetCore.Authentication.JwtBearer.JwtBearerHandler.HandleAuthenticateAsync()
   at Microsoft.AspNetCore.Authentication.JwtBearer.JwtBearerHandler.HandleAuthenticateAsync()
   at Microsoft.AspNetCore.Authentication.AuthenticationHandler`1.AuthenticateAsync()
   at Microsoft.AspNetCore.Authentication.AuthenticationService.AuthenticateAsync(HttpContext context, String scheme)
   at Microsoft.AspNetCore.Authentication.AuthenticationMiddleware.Invoke(HttpContext context)
   at Microsoft.AspNetCore.Cors.Infrastructure.CorsMiddleware.Invoke(HttpContext context)
   at CorrelationId.CorrelationIdMiddleware.Invoke(HttpContext context, ICorrelationContextFactory correlationContextFactory)
   at Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http.HttpProtocol.ProcessRequests[TContext](IHttpApplication`1 application)

JwtBearer的配置为

            services.AddAuthentication(options =>
            {
                options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
                options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;

            }).AddJwtBearer(options =>
            {
                options.Authority = domain;
                options.Audience = audience;
            });

0 个答案:

没有答案