如何解决AuthenticationMiddleware中的异常导致ExceptionHandlerMiddleware
在我的ASP.NET Core 3.1应用程序的AuthenticationHandler类中,我尝试从另一个ASP.NET Core 3.1请求一个令牌,而我将其设置为令牌分发者。我想知道如果令牌分发者恰好处于脱机状态会发生什么。当然,这导致HttpRequestException
发生。
但是,我还通过使用设置了ExceptionHandler
app.UseExceptionHandler("/error");
在接收端是一个带有以下代码的ErrorController:
[ApiController]
[ApiExplorerSettings(IgnoreApi = true)]
public class ErrorController : ControllerBase
{
[Route("/error")]
public IActionResult ErrorLocalDevelopment(
[FromServices] IWebHostEnvironment webHostEnvironment)
{
return Ok();
}
}
但是不要紧,因为甚至没有调用该动作。看来ExceptionHandlerMiddleware内部发生异常,阻止了该操作被调用。
它会继续向HttpRequestException
处添加一些额外的行。
这是堆栈跟踪:
fail: Microsoft.AspNetCore.Diagnostics.ExceptionHandlerMiddleware[1]
An unhandled exception has occurred while executing the request.
System.Net.Http.HttpRequestException: Connection refused
---> System.Net.Sockets.SocketException (61): Connection refused
at System.Net.Http.ConnectHelper.ConnectAsync(String host,Int32 port,CancellationToken cancellationToken)
--- End of inner exception stack trace ---
at System.Net.Http.ConnectHelper.ConnectAsync(String host,CancellationToken cancellationToken)
at System.Net.Http.HttpConnectionPool.ConnectAsync(HttpRequestMessage request,Boolean allowHttp2,CancellationToken cancellationToken)
at System.Net.Http.HttpConnectionPool.CreateHttp11ConnectionAsync(HttpRequestMessage request,CancellationToken cancellationToken)
at System.Net.Http.HttpConnectionPool.GetHttpConnectionAsync(HttpRequestMessage request,CancellationToken cancellationToken)
at System.Net.Http.HttpConnectionPool.SendWithRetryAsync(HttpRequestMessage request,Boolean doRequestAuth,CancellationToken cancellationToken)
at System.Net.Http.RedirectHandler.SendAsync(HttpRequestMessage request,CancellationToken cancellationToken)
at System.Net.Http.DiagnosticsHandler.SendAsync(HttpRequestMessage request,CancellationToken cancellationToken)
at Microsoft.Extensions.Http.Logging.LoggingHttpMessageHandler.SendAsync(HttpRequestMessage request,CancellationToken cancellationToken)
at Microsoft.Extensions.Http.Logging.LoggingScopeHttpMessageHandler.SendAsync(HttpRequestMessage request,CancellationToken cancellationToken)
at System.Net.Http.HttpClient.FinishSendAsyncUnbuffered(Task`1 sendTask,HttpRequestMessage request,CancellationTokenSource cts,Boolean disposeCts)
at Refit.RequestBuilderImplementation.<>c__DisplayClass14_0`2.<<BuildCancellableTaskFuncForMethod>b__0>d.MoveNext() in /_/Refit/RequestBuilderImplementation.cs:line 245
--- End of stack trace from previous location where exception was thrown ---
at [ProjectName].Assemblers.ApiKeyAssembler.GetApiKey(String key) in [ProjectPath]ApiKeyAssembler.cs:line 23
at [ProjectName].Authentication.ApiKeyAuthenticationHandler.HandleAuthenticateAsync() in [ProjectPath]ApiKeyAuthenticationHandler.cs:line 57
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.Diagnostics.ExceptionHandlerMiddleware.<Invoke>g__Awaited|6_0(ExceptionHandlerMiddleware middleware,HttpContext context,Task task)
fail: Microsoft.AspNetCore.Diagnostics.ExceptionHandlerMiddleware[3]
An exception was thrown attempting to execute the error handler.
System.Net.Http.HttpRequestException: Connection refused
---> System.Net.Sockets.SocketException (61): Connection refused
at System.Net.Http.ConnectHelper.ConnectAsync(String host,String scheme)
at Microsoft.AspNetCore.Authentication.AuthenticationMiddleware.Invoke(HttpContext context)
at Microsoft.AspNetCore.Diagnostics.ExceptionHandlerMiddleware.HandleException(HttpContext context,ExceptionDispatchInfo edi)
fail: Microsoft.AspNetCore.Server.Kestrel[13]
Connection id "0HM1UM7U89F38",Request id "0HM1UM7U89F38:00000001": An unhandled exception was thrown by the application.
System.Net.Http.HttpRequestException: Connection refused
---> System.Net.Sockets.SocketException (61): Connection refused
at System.Net.Http.ConnectHelper.ConnectAsync(String host,Task task)
at Microsoft.AspNetCore.Diagnostics.ExceptionHandlerMiddleware.HandleException(HttpContext context,ExceptionDispatchInfo edi)
at Microsoft.AspNetCore.Diagnostics.ExceptionHandlerMiddleware.<Invoke>g__Awaited|6_0(ExceptionHandlerMiddleware middleware,Task task)
at Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http.HttpProtocol.ProcessRequests[TContext](IHttpApplication`1 application)
info: Microsoft.AspNetCore.Hosting.Diagnostics[2]
Request finished in 1156.4184ms 500
呼叫ApiKeyAssembler.GetApiKey(String key)
是对我们的令牌分配器服务的改装呼叫,如上所述,该服务不在线。
我已经工作了几个小时,但是我找不到任何解决方法。
编辑:
我更详细地了解了发生了什么。当ExceptionHandler试图到达其目的地时发生异常时,会发生这种情况。显然,当尝试到达ErrorController时,将再次运行AuthenticationHandler,这首先就是导致异常的原因。但是,在尝试执行不需要身份验证的操作时,我似乎无法弄清楚如何阻止这种情况的发生。
解决方法
我的异常处理程序路由也有类似的问题,您的上一次编辑帮助我指明了正确的方向。尝试在ErrorController操作上使用[AllowAnonymous]属性。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。