Я использую Microsoft.AspNetCore.Authentication.JwtBearer, версия = 2.1.2.0 для проверки подлинности запроса в приложении asp.net core 2.1. Приложение развернуто на кластере Kubernetes в образах Linux Docker. Сервер аутентификации находится за пределами кластера.
Иногда (редко), когда пакету JwtBearer необходимо обновить аутентичную конфигурацию с аутентификацией, возникает исключение 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;
});