C# ASP.NET Web API JWT间歇性401错误
在Web API中使用带有有效令牌的JWTBeareAuthentication时,我偶尔会遇到401个错误。在大多数情况下,它似乎工作得很好,但偶尔它会无缘无故地开始使用401。我可以使用邮递员与完全相同的令牌后,它给我的错误,它的工作良好 似乎一旦开始提供401,它们就会越来越频繁地出现,直到应用程序无法使用为止。然后我循环使用应用程序池,它似乎可以恢复一段时间。内存使用似乎没有失控,所以我不认为这是内存泄漏 以下是启动中的配置C# ASP.NET Web API JWT间歇性401错误,c#,asp.net,asp.net-web-api,jwt,C#,Asp.net,Asp.net Web Api,Jwt,在Web API中使用带有有效令牌的JWTBeareAuthentication时,我偶尔会遇到401个错误。在大多数情况下,它似乎工作得很好,但偶尔它会无缘无故地开始使用401。我可以使用邮递员与完全相同的令牌后,它给我的错误,它的工作良好 似乎一旦开始提供401,它们就会越来越频繁地出现,直到应用程序无法使用为止。然后我循环使用应用程序池,它似乎可以恢复一段时间。内存使用似乎没有失控,所以我不认为这是内存泄漏 以下是启动中的配置 var configurationManager=新配置管理
var configurationManager=新配置管理器(
权限+“/.众所周知的/openid配置”,
新的OpenIdConnectConfigurationRetriever(),
新的HttpDocumentRetriever());
app.useJWTBeareAuthentication(新的JWTBeareAuthenticationOptions
{
AuthenticationMode=AuthenticationMode.Active,
TokenValidationParameters=新的TokenValidationParameters
{
ValidAudience=“观众”,
ValidIssuer=权威,
IssuerSigningKeyResolver=(令牌、安全令牌、标识符、参数)=>
{
var discoveryDocument=Task.Run(()=>configurationManager.GetConfigurationAsync()).GetAwaiter().GetResult();
返回discoveryDocument.SigningKeys;
}
}
});
这是相关的软件包
我用这个来构建应用程序
以前有人见过类似的情况吗?几乎没有信息可以找到可能的原因。但是,我们可以考虑一件事,委托本身是一个同步块,但是您在同一个上下文中调用一个名为<代码> Aycy的方法。这很可能被死锁阻止
var discoveryDocument = Task.Run(() => configurationManager.GetConfigurationAsync()).GetAwaiter().GetResult();
而是将代码转换为此代码-
var discoveryDocument = configurationManager.GetConfigurationAsync().ConfigureAwait(false).GetAwaiter().GetResult();
你可以在这篇博文中读到它-
不确定这是否是导致问题的原因。一种可能的假设是,此代码导致死锁,并且池中的线程可能已经用完,并且随着时间的推移,401
的副作用也在增加
我建议运行内存分析器,看看这是否真的会导致死锁
var discoveryDocument = Task.Run(() => configurationManager.GetConfigurationAsync()).GetAwaiter().GetResult();
让我知道这些是否解决了问题