У меня есть API. NET Core 2.2 C#, который случайным образом дает сбой со следующим:
2020-08-07 10:44:42.039 +00:00 [Error] Exception occurred while processing message.
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()
2020-08-07 10:44:42.062 +00:00 [Error] Connection ID ""17798225728978863173"", Request ID ""8000c446-0000-f700-b63f-84710c7967bb"": 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.StaticFiles.StaticFileMiddleware.Invoke(HttpContext context)
at Swashbuckle.AspNetCore.SwaggerUI.SwaggerUIMiddleware.Invoke(HttpContext httpContext)
at Swashbuckle.AspNetCore.Swagger.SwaggerMiddleware.Invoke(HttpContext httpContext, ISwaggerProvider swaggerProvider)
at Microsoft.AspNetCore.Server.IIS.Core.IISHttpContextOfT`1.ProcessRequestAsync()
Я не могу воссоздать эту проблему в другой среде. Мне кажется, что есть проблемы с промежуточным программным обеспечением (или, может быть, с аутентификацией)
Я унаследовал проект и заметил, что промежуточное программное обеспечение может быть не в правильном порядке: Startup.cs:
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
// swagger
app.UseSwagger();
app.UseSwaggerUI(options => options.ConfigureSwaggerUi(this.Configuration));
// versioning
app.UseCustomApiVersionHeader(this.Configuration);
// authentication
app.UseAuthentication();
// static files
app.UseStaticFiles();
app.UseMvc();
}
У меня также есть настраиваемая служба аутентификации:
public void ConfigureServices(IServiceCollection services)
{
...
services.AddCustomAuthentication(this.Configuration);
...
}
AuthenticationIo C:
namespace Authentication.Api.Middleware
{
public static class CustomAuthenticationIoc
{
public static IServiceCollection AddCustomAuthentication(this IServiceCollection services, IConfiguration configuration)
{
var domain = $"https://{configuration["security:domain"]}/";
services.AddAuthentication(options =>
{
options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
}).AddJwtBearer(options =>
{
options.Authority = $"https://{configuration["security:domain"]}/";
options.Audience = configuration["security:audience"];
});
// get all policies
var policies = configuration["security:policies"]?
.Split(' ', StringSplitOptions.RemoveEmptyEntries)?
.ToList();
services.AddAuthorization(configure: options =>
{
foreach (var policyItem in policies)
{
options.AddPolicy(policyItem,
policy => policy.Requirements.Add(new HasScopeRequirement(policyItem, domain)));
}
});
// register the scope authorization handler
services.AddSingleton<IAuthorizationHandler, HasScopeHandler>();
return services;
}
}
}
Любая помощь будет принята с благодарностью, так как я изучил множество различных корней: экология, Аутентификация и JWT Swagger et c.