ASP.NET Web API JWT с периодическими ошибками 401 - PullRequest
0 голосов
/ 17 апреля 2019

Иногда я получаю 401 сообщение об ошибке при использовании JwtBearerAuthentication в веб-API с допустимым токеном. Кажется, в большинстве случаев он работает нормально, но время от времени он начинает выбрасывать 401 без причины. Я могу использовать почтальон с точно таким же токеном сразу после того, как он выдаст мне ошибку, и она отлично работает.

Кажется, как только он начинает давать 401, они продолжают появляться все чаще и чаще, пока приложение не станет непригодным для использования. Затем я перезагружаю пул приложений, и он, похоже, на некоторое время восстанавливается. Использование памяти, кажется, не выходит из-под контроля, поэтому я не думаю, что это утечка памяти.

Вот конфигурация при запуске


    var configurationManager = new ConfigurationManager<OpenIdConnectConfiguration>(
        authority + "/.well-known/openid-configuration",
        new OpenIdConnectConfigurationRetriever(),
        new HttpDocumentRetriever());

    app.UseJwtBearerAuthentication(new JwtBearerAuthenticationOptions
    {
        AuthenticationMode = AuthenticationMode.Active,
        TokenValidationParameters = new TokenValidationParameters
        {
            ValidAudience = "AUDIENCE",
            ValidIssuer = authority,
            IssuerSigningKeyResolver = (token, securityToken, identifier, parameters) =>
            {
                var discoveryDocument = Task.Run(() => configurationManager.GetConfigurationAsync()).GetAwaiter().GetResult();
                return discoveryDocument.SigningKeys;
            }
        }
    });

Вот соответствующие пакеты


    <packages> 
      <package id="Microsoft.IdentityModel.JsonWebTokens" version="5.3.0" targetFramework="net462" /> 
      <package id="Microsoft.IdentityModel.Logging" version="5.3.0" targetFramework="net462" /> 
      <package id="Microsoft.IdentityModel.Protocols" version="5.3.0" targetFramework="net462" /> 
      <package id="Microsoft.IdentityModel.Protocols.OpenIdConnect" version="5.3.0" targetFramework="net462" /> 
      <package id="Microsoft.IdentityModel.Tokens" version="5.3.0" targetFramework="net462" /> 
      <package id="Microsoft.Owin" version="4.0.0" targetFramework="net462" /> 
      <package id="Microsoft.Owin.Host.SystemWeb" version="4.0.0" targetFramework="net462" /> 
      <package id="Microsoft.Owin.Security" version="4.0.0" targetFramework="net462" /> 
      <package id="Microsoft.Owin.Security.Jwt" version="4.0.0" targetFramework="net462" /> 
      <package id="Microsoft.Owin.Security.OAuth" version="4.0.0" targetFramework="net462" /> 
      <package id="System.IdentityModel.Tokens.Jwt" version="5.3.0" targetFramework="net462" /> 
    </packages>

Я создал приложение, используя учебник

Кто-нибудь видел что-нибудь подобное раньше?

1 Ответ

1 голос
/ 17 апреля 2019

Существует очень мало информации, чтобы найти возможную причину. Однако мы можем рассмотреть одну вещь: сам делегат является синхронным блоком, но вы вызываете метод async с ожидающим в том же контексте. Скорее всего, это заблокировано тупиком.

var discoveryDocument = Task.Run(() => configurationManager.GetConfigurationAsync()).GetAwaiter().GetResult();

вместо этого преобразуйте код в этот -

var discoveryDocument = configurationManager.GetConfigurationAsync().ConfigureAwait(false).GetAwaiter().GetResult();

Вы можете прочитать об этом в этом блоге - https://blog.stephencleary.com/2012/07/dont-block-on-async-code.html

Не уверен, если это вызывает проблему. Возможная гипотеза может заключаться в том, что этот код вызывает тупик, и у вас могут быть исчерпаны потоки в пуле, и как побочный эффект 401 увеличивается со временем.

Я бы порекомендовал запустить профилировщик памяти, чтобы увидеть, действительно ли это вызывает тупик.

Дайте мне знать, если это решит проблему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...